home *** CD-ROM | disk | FTP | other *** search
/ Die Ultimative Software-P…i Collection 1996 & 1997 / Die Ultimative Software-Pakete CD-ROM fur Atari Collection 1996 & 1997.iso / m / musik / notedita / quelltxt.lst < prev    next >
Encoding:
File List  |  1996-11-17  |  347.2 KB  |  5,911 lines

  1. ' Prg zum Schreiben kurzer Notenstücke für c-Flöte allein | 'NOTEDITA.GFA' V.1.0
  2. ' ##############################################################################
  3. ON ERROR GOSUB a_fehler_abfangen  !_:            * Stückanz.: 160 pro Diskette
  4. @0_globalvariablen                !_:            * Textlänge: 200 Noten=1Bldsch.
  5. @0_programmbild_malen             !_:            * Tonlängen: 1/4,1/8,1/16,1/32
  6. @0_hauptfile_laden                !_:            * Tonumfang: c1...c3/einstimmig
  7. @0_midi_vorbereiten               !_:            * Keyboard.: Casio MT-260(opt.)
  8. @0_hauptschleife                  !_:            * P.sprache: GFA-BASIC 3.07 D
  9. ' ##############################################################################
  10. '   V o r b e r e i t u n g e n :
  11. ' ##############################################################################
  12. > PROCEDURE 0_globalvariablen     !_:
  13.   ' ----------------------------------------------------------------------------
  14.   '       Lokalvariablen für diese Prozedur:
  15.   ' ----------------------------------------------------------------------------
  16.   LOCAL j|              ! Zählvariable
  17.   LOCAL i|              ! Zählvariable
  18.   LOCAL z|              ! Zählvariable
  19.   LOCAL lz|             ! Notenlinienzwischenraumanzahl pro Notenzeile
  20.   LOCAL i%              ! Zählvariable
  21.   LOCAL r%              ! Druckerparameter dezimal
  22.   LOCAL a$              ! Druckerparameter binär
  23.   ' ----------------------------------------------------------------------------
  24.   '     D r u c k e r a n p a s s u n g :
  25.   ' ----------------------------------------------------------------------------
  26.   LET r%=XBIOS(33,-1)   ! Druckparameter lesen
  27.   ' PRINT a$            ! test
  28.   LET a$=BIN$(r%)       ! Binär
  29.   MID$(a$,LEN(a$)-2)="1"! 960 Punkte setzen : GFA-Handbuch: 12 - 25
  30.   LET r%=VAL("&X"+a$)   ! Dezimal
  31.   LET r%=XBIOS(33,r%)   ! Parameter setzen
  32.   ' LET r%=XBIOS(33,-1) ! Parameter lesen / test
  33.   ' LET a$=BIN$(r%)     ! test
  34.   ' PRINT a$            ! test
  35.   ' ----------------------------------------------------------------------------
  36.   '     K o n s t a n t e n :
  37.   ' ----------------------------------------------------------------------------
  38.   '                     ! B i l d s c h i r m a b m e s s u n g e n :
  39.   LET g_bb%=640         ! Bildschirmbreite
  40.   LET g_bh%=400         ! Bildschirmhöhe
  41.   '                     ! N o t e n r e c h t e c k :
  42.   LET g_nb|=16          ! Notenrechteckbreite
  43.   '                     ! M e n ü v a r i a b l e :
  44.   LET g_mh|=35          ! Menühöhe (da bei Null angefangen, geht das Menü bis
  45.   '                     ! einschließlich: g_mh|-1, d.h. die oberste Notenzeile
  46.   '                     ! fängt an bei einschließlich y=g_mh|. Bitte so
  47.   '                     ! wählen, daß g_nzlh|(Notenzeilenhöhe) ganze Zahl wird !
  48.   '                     ! N o t e n z e i l e :
  49.   LET g_za|=5           ! Anzahl der Notenzeilen: so wählen, daß
  50.   '                     ! g_nzlh| eine ganze Zahl wird:
  51.   LET g_nzlh|=(g_bh%-g_mh|)/g_za| ! Notenzeilenhöhe berechnen: (Bildschirmhöhe
  52.   '                     ! -Menühöhe)/Anzahl der Notenzeilen
  53.   LET lz|=11            ! Notenlinienzwischenraumanzahl pro Notenzeile:
  54.   '                     ! 5 Hauptnotenlinien = [4] Zwischenräume +
  55.   '                     ! 1 untere Linie + Randabstand = 1 + 2 = [3]
  56.   '                     ! 2 obere Linien + Randabstand = 2 + 2 = [4]
  57.   LET g_la|=g_nzlh|/lz| ! Abstand zwischen zwei Notenlinien berechnen:
  58.   '                     ! Zeilenhöhe / Linienzwischenraumanzahl pro Notenzeile
  59.   '                     ! Dieser Notenlinienabstand ist eigentlich eins weniger,
  60.   '                     ! weil eine Notenliniendicke (=1) miteinberechnet wurde.
  61.   '                     ! Die Zahl muß durch 2 teilbar sein,wegen '2_noten_foto'
  62.   '                     ! O b e r e  N o t e n a n z a h l s c h r a n k e :
  63.   LET g_npz|=g_bb%/(g_nb|)  ! Anzahl der Noten pro Zeile berechnen:
  64.   '                     ! Bildschirmbreite / Notenbreite+Notenabstand
  65.   LET g_os%=g_za|*g_npz|! obere Schranke aller Noten berechnen:
  66.   '                     ! Notenzeilenanzahl * Zeilenanzahl
  67.   '                     ! T o n h ö h e n - & P e r i o d e n a n z a h l :
  68.   LET g_tha|=25         ! Tonhöhenanzahl=Tontastenanzahl: c1 - c3
  69.   LET g_tpa|=3          ! Tonperiodenanzahl,beginne mit 0: 1/4, 1/8, 1/16, 1/32
  70.   '                     ! K l a v i a t u r t a s t e n b r e i t e :
  71.   LET g_ntb|=24         ! Notentastenbreite
  72.   LET g_ptb|=20         ! Pausentastenbreite
  73.   '                     ! S o u n d p a r a m e t e r :
  74.   LET g_vz|=24          ! Verzögerungswert: muß durch 2^g_tpa| teilbar sein
  75.   LET g_okt|=4          ! Startoktave (bei 4 Oktaven ist das die 3.von unten)
  76.   '                     ! für Sound-Befehl (also nicht für MIDI)
  77.   LET g_ls|=12          ! Lautstärke (1-12 [+3=15,1.Note im Takt])
  78.   LET g_sp%=40          ! Pause zwischen den Stücken für's Abspielen
  79.   '                     ! S t ü c k a n z a h l :
  80.   LET g_stka|=160       ! 8*20 Stücke können in den Ram-Speicher geladen werden.
  81.   '                     ! C u r s o r s t r i n g :
  82.   LET g_cs$=""          ! Völlig leerer Notenbereich, auch ohne Notenlinien
  83.   '                     ! L e e r z e i c h e n n e g a t i v :
  84.   LET g_lz$=""          ! Da kommt einfach ein Stück leere Notenzeile rein
  85.   '                     ! L ö s c h n o t e :
  86.   LET g_ln$=""          ! Da kommt ein Stück Notenzeile ohne Note rein
  87.   '                     ! N o t e n s c h l ü s s e l :
  88.   LET g_ns$=""          ! Da kommt der Notenschlüssel rein
  89.   '                     ! P r o g r a m m n a m e :
  90.   LET g_prgname$=""     ! Bildspeicher für Programmname
  91.   '                     ! D a t e i n a m e n :
  92.   LET g_fn$="A\:.NTA"   ! der Stückname des aktuell bearbeiteten Stücks
  93.   LET g_hf$="HAUPTFLE.NTN" ! vorläufiger Name für die Hauptdatei
  94.   '                     ! K l a v i a t u r :
  95.   LET g_kl$=""          ! Die Klaviatur soll fotografiert werden weg. Infotexte
  96.   '                     ! L e e r b i l d s c h i r m :
  97.   LET g_lb$=""          ! Der ganze Bildschirm ohne Noten soll fotografiert wer.
  98.   '                     ! H e l p t a s t e n t e x t b i l d s c h i r m :
  99.   LET g_hp$=""          ! Helptastenbildschirm speichern
  100.   '                     ! F i l e s e l e c t b o x :
  101.   LET g_fsb$=""         ! Fileselectbox wird fotografiert werden
  102.   '                     ! T e s t :
  103.   LET g_proctest$=""    ! Name der aufrufenden Prozedur fürDebugging
  104.   '                     ! B l o c k v a r i a b l e n :
  105.   LET g_bla%=0          ! Blockanfang
  106.   LET g_ble%=0          ! Blockende
  107.   '                     ! M i d i :
  108.   LET g_k1|=10          ! Elec.-Piano-Sound auf Kanal 1
  109.   LET g_k2|=18          ! Synth.-Ens-Sound  auf Kanal 2
  110.   LET g_k3|=9           ! Percussion-Sound auf  Kanal 3
  111.   LET g_perc|=0         ! Schlagzeugwahl
  112.   ' ----------------------------------------------------------------------------
  113.   '     L a u f v a r i a b l e n :
  114.   ' ----------------------------------------------------------------------------
  115.   LET g_w!=FALSE        ! =-1: Statt normalem Hauptfile anderes laden
  116.   LET g_midi!=FALSE     ! =-1: Midi-Keyboard angeschlossen
  117.   '                     ! N o t e n n u m m e r n :
  118.   LET g_mt|=0           ! Merker für alte Tonhöhe( siehe Procedrue'a2_s')
  119.   LET g_n%=1            ! aktuelle Notennummer=Cursorposition
  120.   LET g_mn%=0           ! bisherige, maximale Notennummer
  121.   LET gu_mn%=0          ! maximale notennummer bei Undostück
  122.   LET g_t%=1            ! 0=1/4, 1=1/8, 2=1/16, 3=1/32
  123.   ' ----------------------------------------------------------------------------
  124.   '     A r r a y s :
  125.   ' ----------------------------------------------------------------------------
  126.   '                     ! F r e q u e n z - A r r a y :
  127.   DIM fr%(25*2)         ! Frequenzen aller 25 Tasten einschließlich Vierteltöne
  128.   RESTORE frequenzen    ! Read-Zeiger auf Frequenzdatei
  129.   FOR i|=1 TO 25*2      ! d
  130.     READ fr%(i|)        ! Frequenz einlesen
  131.   NEXT i|               ! d
  132.   '                     ! S t u e c k e - A r r a y :
  133.   DIM g_stueck$(g_stka|+1)! Hier stehen alle Stücke drin, die derzeit bearbeitet
  134.   '                     ! werden können.
  135.   '                     ! 0.Stelle Inhvz., 1. Stelle Datum, deshalb 161 statt159
  136.   '                     ! B o o l - F e l d  f ü r  H a u p t m e n ü :
  137.   DIM g_zs!(2,5)        ! Dimensionierung Bool-Feld: Zeilen 1-2 , Spalten a-e
  138.   ' ............................................................................
  139.   '                     ! N o t e n s p e i c h e r :
  140.   DIM g_n$(g_os%+1)     ! Notenspeicher g_n$(g_n%) ist String mit den Stellen:
  141.   '                     ! 1.) Tonhöhe (a-y) c1=a, c3=y, Pause=z
  142.   '                     ! 2.) Periodendauerkennziffer (0-3):
  143.   '                           0=1/4, 1=1/8, 2=1/16, 3=1/32
  144.   '                     ! 3.) Gebunden mit Vorgängernote ? (Ja=1,Nein=0)
  145.   '                     ! 4.) Betonte Note ? (Ja=1,Nein=0)
  146.   DIM gu_n$(g_os%+1)    ! Undostück-Array identisch mit g_n$()-Array vor letz-
  147.   '                     ! tem Befehl.
  148.   ' ............................................................................
  149.   '                     ! N o t e n b i l d s p e i c h e r :
  150.   DIM g_nb$(g_tha|+1,g_tpa|,1,1) ! Notenbildspeicherarray, die Argumente sind:
  151.   '                     ! 1.) Tonhöhe (1-26) c1=1, c3=25, Pause=26
  152.   '                     ! 2.) Periodendauerkennziffer (0-3)
  153.   '                           0=1/4, 1=1/8, 2=1/16, 3=1/32
  154.   '                     ! 3.) Gebunden mit Vorgängernote ? (Ja=1,Nein=0)
  155.   '                     ! 4.) Betonte Note ? (Ja=1,Nein=0)
  156.   ' Dieser Array wird in der Prozedur '2_noten_foto(,)' gefüllt
  157.   ' ............................................................................
  158.   '                     ! S t a r t k o o r d i n a t e n :
  159.   '                     ! (links oben) eines Notenrechtecks:
  160.   DIM g_x%(g_os%+1)     ! x-Startkoordinatenarray (über maximale Notenanzahl)
  161.   DIM g_y%(g_os%+1)     ! y-Startkoordinatenarray (über maximale Notenanzahl)
  162.   ' ............................................................................
  163.   FOR i%=1 TO g_os%     ! Alle Notennummern=Notenpositionen durch:
  164.     ' ..........................................................................
  165.     INC j|              ! Zähler für Notenspalte um eins erhöhen
  166.     ' ..........................................................................
  167.     LET g_x%(i%)=(j|-1)*g_nb|            ! x-Startk. für Note i% berechn.:
  168.     '                                    ! (Sp.zähler-1)*Notenbreite
  169.     LET g_y%(i%)=g_mh|+z|*g_nzlh|        ! y-Startk. für Note i% berechn.:
  170.     '                                    ! (y-Start der 1.Notenzeile +
  171.     '                                    ! Notenzeile * Notenzeilenhöhe)
  172.     '    BOX g_x%(i%),g_y%(i%),g_x%(i%)+g_nb|,g_y%(i%)+g_nzlh| ! Testbild
  173.     ' ..........................................................................
  174.     IF j|=g_npz|        ! F rechts angelangt, also Zeile zu ende:
  175.       LET j|=0          ! Zähler für Notenspalte null
  176.       INC z|            ! Zähler für Notenzeile um eins erhöhen
  177.     ENDIF               ! EF rechts angelangt
  178.     ' ..........................................................................
  179.   NEXT i%               ! Nächste Notennummer=Notenposition
  180.   ' ----------------------------------------------------------------------------
  181. RETURN
  182. > PROCEDURE 0_programmbild_malen  !_:
  183.   ' ----------------------------------------------------------------------------
  184.   LOCAL w$              ! Tastaturspeicher
  185.   ' ............................................................................
  186.   @1_helptaste          ! Text einlesen für Drücken der Help-Taste
  187.   GET g_x%(1),g_y%(1),g_x%(1)+g_nb|-1,g_y%(1)+g_nzlh|-2,g_cs$ ! Cursorstr.fotogr
  188.   @1_notenschluessel    ! d
  189.   @1_programmname       ! d
  190.   PRINT AT(5,17);"Startvorbereitungen für ";CHR$(27);CHR$(112);"  N O T E D I T A  ";CHR$(27);CHR$(113);" Bitte warten... "
  191.   @1_notenbild_array    ! Dort werden die Noten gemalt und dann photographiert
  192.   @1_notenlinien        ! d
  193.   @1_begrenzungslinien  ! zw 2 Notenzeilen, jeweils 1 über y-Startpunkt v. Zle
  194.   @1_klaviatur          ! d
  195.   GET g_x%(1),g_y%(1),g_x%(1)+g_nb|-1,g_y%(1)+g_nzlh|-2,g_ln$ ! Löschnote fotogr
  196.   GET g_x%(1),g_y%(1),g_x%(1)+g_nb|-1,g_y%(1)+g_nzlh|-2,g_lz$ ! Leerz. fotogr.
  197.   SGET g_lb$            ! Den ganzen Leerbildschirm fotografieren
  198.   PRINT AT(5,17);"Startvorbereitungen für ";CHR$(27);CHR$(112);"  N O T E D I T A  ";CHR$(27);CHR$(113);" Bitte warten... "
  199.   GET 0,0,g_bb%-1,g_mh|-1,g_kl$     ! Klaviatur fotografieren
  200.   PUT g_x%(g_n%),g_y%(g_n%),g_cs$,9 ! Cusor ein
  201.   LET w$=INKEY$         ! F was von der Tastatur anliegt:
  202.   IF w$=" "             ! F Wahlmöglichkeit für Hauptfile erwünscht:
  203.     LET g_w!=TRUE       ! Flag für freie Wahl des Hauptfiles setzten
  204.   ENDIF                 ! d
  205.   ' ----------------------------------------------------------------------------
  206. RETURN
  207. ' ------------------------------------------------------------------------------
  208. > PROCEDURE 1_helptaste           !_:
  209.   ' ----------------------------------------------------------------------------
  210.   LOCAL a$                      ! Lesestring
  211.   ' ............................................................................
  212.   CLS                           ! Bildschirm löschen
  213.   RESTORE helptext              ! Zeiger setzen
  214.   READ a$                       ! Zeile einlesen
  215.   REPEAT                        ! Leseschleife
  216.     LET a$=a$                   ! linker Rand von 0 Spalten
  217.     PRINT a$;                   ! Zeile auf Bildschirm
  218.     IF LEN(a$)<80 AND NOT LEFT$(a$,7)=" Zurück" ! F bis nicht bis zum r. Rand :
  219.       PRINT                     ! LF
  220.     ENDIF                       ! d
  221.     READ a$                     ! Zeile einlesen
  222.   UNTIL a$="**"                 ! Ende
  223.   '  GET 0,0,g_bb%-1,g_bh%-1,a$    ! Bildschirm retten
  224.   '  PUT 0,0,a$,8                  ! Bildschirm invertieren
  225.   SGET g_hp$                    ! Helptastenbildschirm speichern
  226.   CLS                           ! Bildschirm sauber machen
  227.   ' ----------------------------------------------------------------------------
  228. RETURN
  229. > PROCEDURE 1_notenschluessel     !_:
  230.   ' ----------------------------------------------------------------------------
  231.   LOCAL x%                      ! x-Koordinate vom aktuellen Punkt
  232.   LOCAL y%                      ! y-Koordinate vom aktuellen Punkt
  233.   LOCAL x%                      ! x-Koordinate vom alten Punkt
  234.   LOCAL y%                      ! y-Koordinate vom alten Punkt
  235.   ' ............................................................................
  236.   RESTORE notenschluessel       ! Read-Zeiger auf Notenschlüssel-daten
  237.   REPEAT                        ! Leseschleife
  238.     READ x%,y%                  ! Koordinaten für aktuellen Punkt einlesen
  239.     IF mx%<>0 AND x%<>-1        ! f alter Punkt nicht 0 und neuer nicht letzter:
  240.       LINE mx%,my%,x%,y%        ! vom alten zum aktuellen Punkt Linie zeichnen
  241.     ENDIF                       ! d
  242.     LET mx%=x%                  ! aktuellen Punkt merken
  243.     LET my%=y%                  ! d
  244.   UNTIL x%=-1                   ! raus f Koordinate= -1
  245.   ' ............................................................................
  246.   '                             ! Notenschlüssel fotografieren:
  247.   GET g_x%(51),g_y%(51),g_x%(51)+2*g_nb|-1,g_y%(51)+g_nzlh|-2,g_ns$
  248.   CLS                           ! Bildschirm löschen
  249.   ' ----------------------------------------------------------------------------
  250. RETURN
  251. > PROCEDURE 1_programmname        !_:
  252.   ' ----------------------------------------------------------------------------
  253.   LOCAL x%                      ! x-Koordinate vom aktuellen Punkt
  254.   LOCAL y%                      ! y-Koordinate vom aktuellen Punkt
  255.   LOCAL x%                      ! x-Koordinate vom alten Punkt
  256.   LOCAL y%                      ! y-Koordinate vom alten Punkt
  257.   ' ............................................................................
  258.   RESTORE programmname          ! Read-Zeiger auf Programmname-daten
  259.   REPEAT                        ! Leseschleife
  260.     READ x%,y%                  ! Koordinaten für aktuellen Punkt einlesen
  261.     IF mx%<>0 AND x%<>-1        ! f alter Punkt nicht 0 und neuer nicht letzter:
  262.       LINE mx%,my%,x%,y%-2        ! vom alten zum aktuellen Punkt Linie zeichnen
  263.     ENDIF                       ! d
  264.     LET mx%=x%                  ! aktuellen Punkt merken
  265.     LET my%=y%                  ! d
  266.   UNTIL x%=-1                   ! raus f Koordinate= -1
  267.   ' ............................................................................
  268.   '                             ! Programmnamen fotografieren:
  269.   GET 56*8,0,80*8-1,16,g_prgname$! d
  270.   PUT 56*8+4,0,g_prgname$,7     ! Schatten
  271.   GET 56*8,0,80*8-1,16,g_prgname$! d
  272.   CLS                           ! Bildschirm löschen
  273.   ' ----------------------------------------------------------------------------
  274. RETURN
  275. > PROCEDURE 1_notenbild_array     !_:
  276.   ' ----------------------------------------------------------------------------
  277.   LOCAL z|              ! Periodenzähler
  278.   LOCAL p|              ! Positionszähler
  279.   LOCAL hua|            ! Noten-mit-Hals-unten-Anzahl, also c1-a
  280.   LOCAL hoa|            ! Noten-mit-Hals-oben-Anzahl,  also h-c3
  281.   LOCAL ka|             ! Kombinationenanzahl der Noten ohne Fähnch. od. Hilfsl.
  282.   LOCAL mg_n%           ! Merker für Notennummer
  283.   ' ............................................................................
  284.   LET hua|=9            ! Noten-mit-Hals-unten-Anzahl
  285.   LET hoa|=6            ! Noten-mit-Hals-oben-Anzahl
  286.   LET ka|=16            ! Kombinationenanzahl der Noten ohne Fähnch. od. Hilfsl.
  287.   LET mg_n%=g_n%        ! Merker für Notennummer
  288.   ' ............................................................................
  289.   @2_noten_malen                ! Noten malen ohne Fähnchen und ohne Hilfslinien
  290.   ' ............................................................................
  291.   FOR z|=0 TO g_tpa|            ! Alle Tonperioden durch (TonPeriodenAnzahl):
  292.     '                           ! Man kann hier auch Fähnchenanzahl dazu sagen.
  293.     LET w$=INKEY$               ! F was von der Tastatur anliegt:
  294.     IF w$="w" OR w$="W"         ! F Wahlmöglichkeit für Hauptfile erwünscht:
  295.       LET g_w!=TRUE             ! Flag für freie Wahl des Hauptfiles setzten
  296.     ENDIF                       ! d
  297.     ' ..........................................................................
  298.     FOR g_n%=1 TO ka|/2         ! Alle Komb ohne Fähnch. od. Hilfsli: Hals unten
  299.       @3_faehnchen(z|,0)        ! z| Fähnchen zeichnen, 0=Hals nach unten
  300.     NEXT g_n%                   ! Nächste Note mit nächster Kombination
  301.     FOR p|=1 TO hua|            ! Alle Notenpositionen mit Hals nach unten durch
  302.       @2_noten_foto(0,p|,z|)    ! d 0=Hals unten, p|=Position für Negativ
  303.     NEXT p|                     ! Nächste Notenposition mit Hals nach unten
  304.     ' ..........................................................................
  305.     FOR g_n%=ka|/2+1 TO ka|     ! Alle Komb ohne Fähnch. od. Hilfsli: Hals oben
  306.       @3_faehnchen(z|,1)        ! z| Fähnchen zeichnen, 1=Hals nach oben
  307.     NEXT g_n%                   ! Nächste Note mit nächster Kombination
  308.     FOR p|=1 TO hoa|            ! Alle Notenpositionen mit Hals nach oben durch
  309.       @2_noten_foto(1,p|,z|)    ! d 1=Hals oben, p|=Position für Negativ
  310.     NEXT p|                     ! Nächste Notenposition mit Hals nach oben
  311.     ' ..........................................................................
  312.     LET g_n%=ka|+1              ! Cursorposition auf Pause
  313.     @3_faehnchen(z|,1)          ! z| Fähnchen zeichnen, 1=Hals nach oben
  314.     ' ..........................................................................
  315.     LET g_n%=ka|+2              ! Cursorposition auf Pause
  316.     @3_faehnchen(z|,1)          ! z| Fähnchen zeichnen, 1=Hals nach oben
  317.     @3_taktstrich               ! Taktstrich
  318.     @2_pausen_foto(ka|+1,z|)    ! Pause fotografieren
  319.     ' ..........................................................................
  320.   NEXT z|                       ! Nächste Tonperiode
  321.   CLS                           ! Noten wieder löschen, Bildschirm also leer
  322.   LET g_n%=mg_n%                ! Notennr.wiederherstellen mit Merker für Notenr
  323.   ' ----------------------------------------------------------------------------
  324. RETURN
  325. > PROCEDURE 2_noten_malen         !_:
  326.   ' ----------------------------------------------------------------------------
  327.   LOCAL h|              ! Zustandszähler: Notenhals unten=0 & Notenhals oben=1
  328.   ' ............................................................................
  329.   LET g_n%=0            ! Notenposition null setzen
  330.   ' ............................................................................
  331.   FOR h|=0 TO 1           ! Notenhals unten: Übergabe=0, oben: Übergabe=1
  332.     ' ..........................................................................
  333.     INC g_n%              ! Eine Notenposition weiter
  334.     @3_notenkopf(h|)      ! Notenkopf
  335.     @3_notenhals(h|)      ! Notenhals
  336.     ' ..........................................................................
  337.     INC g_n%              ! Eine Notenposition weiter
  338.     @3_notenkopf(h|)      ! Notenkopf
  339.     @3_notenhals(h|)      ! Notenhals
  340.     @3_gebundenzeichen(h|)! Gebundenzeichen
  341.     ' ..........................................................................
  342.     INC g_n%              ! Eine Notenposition weiter
  343.     @3_notenkopf(h|)      ! Notenkopf
  344.     @3_notenhals(h|)      ! Notenhals
  345.     '    @3_betonung(h|)       ! Betonungszeichen
  346.     @3_taktstrich         ! Taktstrich
  347.     ' ..........................................................................
  348.     INC g_n%              ! Eine Notenposition weiter
  349.     @3_notenkopf(h|)      ! Notenkopf
  350.     @3_notenhals(h|)      ! Notenhals
  351.     '    @3_betonung(h|)       ! Betonungszeichen
  352.     @3_taktstrich         ! Taktstrich
  353.     @3_gebundenzeichen(h|)! Gebundenzeichen
  354.     ' ..........................................................................
  355.     INC g_n%              ! Eine Notenposition weiter
  356.     @3_notenkopf(h|)      ! Notenkopf
  357.     @3_notenhals(h|)      ! Notenhals
  358.     @3_kreuz(h|)          ! Erhöhungszeichen=Kreuz
  359.     ' ..........................................................................
  360.     INC g_n%              ! Eine Notenposition weiter
  361.     @3_notenkopf(h|)      ! Notenkopf
  362.     @3_notenhals(h|)      ! Notenhals
  363.     @3_kreuz(h|)          ! Erhöhungszeichen=Kreuz
  364.     @3_gebundenzeichen(h|)! Gebundenzeichen
  365.     ' ..........................................................................
  366.     INC g_n%              ! Eine Notenposition weiter
  367.     @3_notenkopf(h|)      ! Notenkopf
  368.     @3_notenhals(h|)      ! Notenhals
  369.     @3_kreuz(h|)          ! Erhöhungszeichen=Kreuz
  370.     '    @3_betonung(h|)       ! Betonungszeichen
  371.     @3_taktstrich         ! Taktstrich
  372.     ' ..........................................................................
  373.     INC g_n%              ! Eine Notenposition weiter
  374.     @3_notenkopf(h|)      ! Notenkopf
  375.     @3_notenhals(h|)      ! Notenhals
  376.     @3_kreuz(h|)          ! Erhöhungszeichen=Kreuz
  377.     '    @3_betonung(h|)       ! Betonungszeichen
  378.     @3_taktstrich         ! Taktstrich
  379.     @3_gebundenzeichen(h|)! Gebundenzeichen
  380.     ' ..........................................................................
  381.   NEXT h|                 ! Notenhals oben
  382.   ' ..........................................................................
  383.   INC g_n%                ! Eine Notenposition weiter
  384.   @3_notenhals(1)         ! Notenhals nach oben soll Pause oh.Taktstr.darstellen
  385.   ' ..........................................................................
  386.   INC g_n%                ! Eine Notenposition weiter
  387.   @3_notenhals(1)         ! Notenhals nach oben soll Pause mitTaktstr.darstellen
  388.   ' ----------------------------------------------------------------------------
  389. RETURN
  390. ' ------------------------------------------------------------------------------
  391. > PROCEDURE 3_notenkopf(h|)       !_:
  392.   ' ----------------------------------------------------------------------------
  393.   ' h|                  ! Notenhals unten:=0, oben:=1
  394.   ' ----------------------------------------------------------------------------
  395.   LOCAL kb|             ! Notenkopf: Pboxbreite
  396.   LOCAL kh|             ! Notenkopf: Pboxhöhe
  397.   LOCAL kx|             ! Notenkopf: x-Startkoordinate
  398.   LOCAL kx|             ! Notenkopf: y-Startkoordinate
  399.   LOCAL x1%             ! links
  400.   LOCAL y1%             ! oben
  401.   LOCAL x2%             ! rechts
  402.   LOCAL y2%             ! unten
  403.   ' ............................................................................
  404.   LET kb|=6             ! Notenkopf: Pboxbreite
  405.   LET kh|=4             ! Notenkopf: Pboxhöhe
  406.   LET kx|=5             ! Notenkopf: x-Startkoordinate
  407.   LET ky|=15            ! Notenkopf: y-Startkoordinate
  408.   ' ............................................................................
  409.   LET x1%=g_x%(g_n%)+kx|! links
  410.   LET y1%=g_y%(g_n%)+ky|! oben
  411.   LET x2%=x1%+kb|       ! rechts
  412.   LET y2%=y1%+kh|       ! unten
  413.   ' ............................................................................
  414.   IF h|=1               ! F Notenhals oben:
  415.     LET x1%=g_x%(g_n%)+g_nb|-kx|        ! links wird zu rechts
  416.     LET y1%=g_y%(g_n%)+g_nzlh|-ky|      ! oben wird zu unten
  417.     LET x2%=x1%-kb|     ! rechts wird zu links
  418.     LET y2%=y1%-kh|     ! unten wird zu oben
  419.   ENDIF                 ! EF Notenhals oben
  420.   ' ............................................................................
  421.   PBOX x1%,y1%,x2%,y2%  ! Notenkopf malen
  422.   ' ----------------------------------------------------------------------------
  423. RETURN
  424. > PROCEDURE 3_notenhals(h|)       !_:
  425.   ' ----------------------------------------------------------------------------
  426.   ' h|                  ! Notenhals unten:=0, oben:=1
  427.   ' ----------------------------------------------------------------------------
  428.   LOCAL lx|             ! x-Startwert
  429.   LOCAL ly|             ! y-Startwert
  430.   LOCAL ll|             ! Notenhalslänge
  431.   LOCAL x%              ! x-Standort
  432.   LOCAL y1%             ! y-Start
  433.   LOCAL y2%             ! y-Ende
  434.   ' ............................................................................
  435.   LET lx|=5             ! x-Startwert
  436.   LET ly|=20            ! y-Startwert
  437.   LET ll|=24            ! Notenhalslänge
  438.   ' ............................................................................
  439.   LET x%=g_x%(g_n%)+lx| ! x-Standort
  440.   LET y1%=g_y%(g_n%)+ly|! y-Start
  441.   LET y2%=y1%+ll|       ! y-Ende
  442.   ' ............................................................................
  443.   IF h|=1               ! F Notenhals oben:
  444.     LET x%=g_x%(g_n%)+g_nb|-lx|         ! links wird zu rechts
  445.     LET y1%=g_y%(g_n%)+g_nzlh|-ly|      ! oben wird zu unten
  446.     LET y2%=y1%-ll|     ! unten wird zu oben
  447.   ENDIF                 ! EF Notenhals oben
  448.   ' ............................................................................
  449.   LINE x%,y1%,x%,y2%    ! Notenhals malen
  450.   ' ----------------------------------------------------------------------------
  451. RETURN
  452. > PROCEDURE 3_taktstrich          !_:
  453.   ' ----------------------------------------------------------------------------
  454.   LOCAL lx|             ! x-Startwert
  455.   LOCAL ly|             ! y-Startwert
  456.   LOCAL ll|             ! Taktstrichlänge
  457.   LOCAL x%              ! x-Standort
  458.   LOCAL y1%             ! y-Start
  459.   LOCAL y2%             ! y-Ende
  460.   ' ............................................................................
  461.   LET lx|=1             ! x-Startwert
  462.   LET ly|=0             ! y-Startwert
  463.   LET ll|=150           ! Taktstrichlänge
  464.   ' ............................................................................
  465.   LET x%=g_x%(g_n%)+lx| ! x-Standort
  466.   LET y1%=ly|           ! y-Start
  467.   LET y2%=ll|           ! y-Ende
  468.   ' ............................................................................
  469.   DEFLINE &X11111111111111111010101010101011,1,0,0         ! Gepunktete Linie
  470.   LINE x%,y1%,x%,y2%    ! Taktstrich malen
  471.   DEFLINE 1,1,0         ! Durchgezogene Linie
  472.   ' ----------------------------------------------------------------------------
  473. RETURN
  474. > PROCEDURE 3_kreuz(h|)           !_:
  475.   ' ----------------------------------------------------------------------------
  476.   ' h|                  ! Notenhals unten:=0, oben:=1
  477.   ' ----------------------------------------------------------------------------
  478.   LOCAL hb|             ! Erhöhungszeichen=Kreuz: Pboxbreite
  479.   LOCAL hh|             ! Erhöhungszeichen=Kreuz: Pboxhöhe
  480.   LOCAL hx|             ! Erhöhungszeichen=Kreuz: x-Startkoordinate
  481.   LOCAL hx|             ! Erhöhungszeichen=Kreuz: y-Startkoordinate
  482.   LOCAL x1%             ! links
  483.   LOCAL y1%             ! oben
  484.   LOCAL x2%             ! rechts
  485.   LOCAL y2%             ! unten
  486.   ' ............................................................................
  487.   LET hb|=5             ! Notenhöheninfo=Kreuz: Boxbreite
  488.   LET hh|=4             ! Notenhöheninfo=Kreuz: Boxhöhe
  489.   LET hx|=5             ! Notenhöheninfo=Kreuz: x-Startkoordinate
  490.   LET hy|=26            ! Notenhöheninfo=Kreuz: y-Startkoordinate
  491.   ' ............................................................................
  492.   LET x1%=g_x%(g_n%)+hx|! links
  493.   LET y1%=g_y%(g_n%)+hy|! oben
  494.   LET x2%=x1%+hb|       ! rechts
  495.   LET y2%=y1%+hh|       ! unten
  496.   ' ............................................................................
  497.   IF h|=1               ! F Notenhals oben:
  498.     LET x1%=g_x%(g_n%)+g_nb|-hx|        ! links wird zu rechts
  499.     LET y1%=g_y%(g_n%)+g_nzlh|-hy|      ! oben wird zu unten
  500.     LET x2%=x1%-hb|     ! rechts wird zu links
  501.     LET y2%=y1%-hh|     ! unten wird zu oben
  502.   ENDIF                 ! EF Notenhals oben
  503.   ' ............................................................................
  504.   BOX x1%,y1%,x2%,y2%   ! Erhöhungszeichen=Kreuz malen
  505.   IF h|=1               ! F Notenhals oben:
  506.     BOX x1%-1,y1%,x2%-1,y2%! dickere Ränder links und rechts
  507.   ELSE                  ! F Notenhals unten:
  508.     BOX x1%+1,y1%,x2%+1,y2%! dickere Ränder links und rechts
  509.   ENDIF                 ! d
  510.   ' ----------------------------------------------------------------------------
  511. RETURN
  512. > PROCEDURE 3_betonung(h|)        !_:
  513.   ' ----------------------------------------------------------------------------
  514.   ' h|                  ! Notenhals unten:=0, oben:=1
  515.   ' ----------------------------------------------------------------------------
  516.   LOCAL bb|             ! Betonungszeichen: Pboxbreite
  517.   LOCAL bh|             ! Betonungszeichen: Pboxhöhe
  518.   LOCAL bx|             ! Betonungszeichen: x-Startkoordinate
  519.   LOCAL bx|             ! Betonungszeichen: y-Startkoordinate
  520.   LOCAL x1%             ! links
  521.   LOCAL y1%             ! oben
  522.   LOCAL x2%             ! rechts
  523.   LOCAL y2%             ! unten
  524.   ' ............................................................................
  525.   LET bb|=4             ! Betonungszeichen: Boxbreite
  526.   LET bh|=2             ! Betonungszeichen: Boxhöhe
  527.   LET bx|=5             ! Betonungszeichen: x-Startkoordinate
  528.   LET by|=22            ! Betonungszeichen: y-Startkoordinate
  529.   ' ............................................................................
  530.   LET x1%=g_x%(g_n%)+bx|! links
  531.   LET y1%=g_y%(g_n%)+by|! oben
  532.   LET x2%=x1%+bb|       ! rechts
  533.   LET y2%=y1%+bh|       ! unten
  534.   ' ............................................................................
  535.   IF h|=1               ! F Notenhals oben:
  536.     LET x1%=g_x%(g_n%)+g_nb|-bx|        ! links wird zu rechts
  537.     LET y1%=g_y%(g_n%)+g_nzlh|-by|      ! oben wird zu unten
  538.     LET x2%=x1%-bb|     ! rechts wird zu links
  539.     LET y2%=y1%-bh|     ! unten wird zu oben
  540.   ENDIF                 ! EF Notenhals oben
  541.   ' ............................................................................
  542.   PBOX x1%,y1%,x2%,y2%  ! Betonungszeichen malen
  543.   ' ----------------------------------------------------------------------------
  544. RETURN
  545. > PROCEDURE 3_gebundenzeichen(h|) !_:
  546.   ' ----------------------------------------------------------------------------
  547.   ' h|                  ! Notenhals unten:=0, oben:=1
  548.   ' ----------------------------------------------------------------------------
  549.   LOCAL bb|             ! Gebundenzeichen: Pboxbreite
  550.   LOCAL bh|             ! Gebundenzeichen: Pboxhöhe
  551.   LOCAL bx|             ! Gebundenzeichen: x-Startkoordinate
  552.   LOCAL bx|             ! Gebundenzeichen: y-Startkoordinate
  553.   LOCAL x1%             ! links
  554.   LOCAL y1%             ! oben
  555.   LOCAL x2%             ! rechts
  556.   LOCAL y2%             ! unten
  557.   ' ............................................................................
  558.   LET gd|=6             ! Gebunden mit vorheriger Note: Boxbreite
  559.   LET gh|=2             ! Gebunden mit vorheriger Note: Boxhöhe
  560.   LET gx|=5             ! Gebunden mit vorheriger Note: x-Startkoordinate
  561.   LET gy|=10            ! Gebunden mit vorheriger Note: y-Startkoordinate
  562.   ' ............................................................................
  563.   LET x1%=g_x%(g_n%)+gx|! links
  564.   LET y1%=g_y%(g_n%)+gy|! oben
  565.   LET x2%=x1%+gd|       ! rechts
  566.   LET y2%=y1%+gh|       ! unten
  567.   ' ............................................................................
  568.   IF h|=1               ! F Notenhals oben:
  569.     LET x1%=g_x%(g_n%)+g_nb|-gx|        ! links wird zu rechts
  570.     LET y1%=g_y%(g_n%)+g_nzlh|-gy|      ! oben wird zu unten
  571.     LET x2%=x1%-gd|     ! rechts wird zu links
  572.     LET y2%=y1%-gh|     ! unten wird zu oben
  573.   ENDIF                 ! EF Notenhals oben
  574.   ' ............................................................................
  575.   BOX x1%,y1%,x2%,y2%   ! Gebundenzeichen malen
  576.   ' ----------------------------------------------------------------------------
  577. RETURN
  578. > PROCEDURE 3_faehnchen(t|,h|)    !_:
  579.   ' ----------------------------------------------------------------------------
  580.   ' t|                  ! Anzahl der Fähnchen
  581.   ' h|                  ! Notenhals unten:=0, oben:=1
  582.   ' ----------------------------------------------------------------------------
  583.   LOCAL ax1|            ! ?-tel-Fähnchen, Linie a: x-Startkoordinate
  584.   LOCAL ax2|            ! ?-tel-Fähnchen, Linie a: x-Endkoordinate
  585.   LOCAL bx2|            ! ?-tel-Fähnchen, Linie b: x-Endkoordinate
  586.   '
  587.   LOCAL a32y1|          ! 32-tel-Fähnchen, Linie a: y-Startkoordinate
  588.   LOCAL a32y2|          ! 32-tel-Fähnchen, Linie a: y-Endkoordinate
  589.   LOCAL b32y1|          ! 32-tel-Fähnchen, Linie b: y-Startkoordinate
  590.   '
  591.   LOCAL a16y1|          ! 16-tel-Fähnchen, Linie a: y-Startkoordinate
  592.   LOCAL a16y2|          ! 16-tel-Fähnchen, Linie a: y-Endkoordinate
  593.   LOCAL b16y1|          ! 16-tel-Fähnchen, Linie b: y-Startkoordinate
  594.   '
  595.   LOCAL a8y1|           ! 8-tel-Fähnchen, Linie a: y-Startkoordinate
  596.   LOCAL a8y2|           ! 8-tel-Fähnchen, Linie a: y-Endkoordinate
  597.   LOCAL b8y1|           ! 8-tel-Fähnchen, Linie b: y-Startkoordinate
  598.   '
  599.   LOCAL x%              ! Speicher für Start-x-Wert des aktuellen Notenfensters
  600.   LOCAL y%              ! Speicher für Start-y-Wert des aktuellen Notenfensters
  601.   '
  602.   LOCAL x1%             ! links
  603.   LOCAL y1%             ! unten
  604.   LOCAL x2%             ! rechts
  605.   LOCAL y2%             ! oben
  606.   ' ............................................................................
  607.   LET ax1|=6            ! ?-tel-Fähnchen, Linie a: x-Startkoordinate
  608.   LET ax2|=9            ! ?-tel-Fähnchen, Linie a: x-Endkoordinate
  609.   LET bx2|=10            ! ?-tel-Fähnchen, Linie b: x-Endkoordinate
  610.   '
  611.   LET a32y1|=35         ! 32-tel-Fähnchen, Linie a: y-Startkoordinate
  612.   LET a32y2|=32         ! 32-tel-Fähnchen, Linie a: y-Endkoordinate
  613.   LET b32y1|=a32y1|+1   ! 32-tel-Fähnchen, Linie b: y-Startkoordinate
  614.   '
  615.   LET a16y1|=39         ! 16-tel-Fähnchen, Linie a: y-Startkoordinate
  616.   LET a16y2|=36         ! 16-tel-Fähnchen, Linie a: y-Endkoordinate
  617.   LET b16y1|=a16y1|+1   ! 16-tel-Fähnchen, Linie b: y-Startkoordinate
  618.   '
  619.   LET a8y1|=43          ! 8-tel-Fähnchen, Linie a: y-Startkoordinate
  620.   LET a8y2|=40          ! 8-tel-Fähnchen, Linie a: y-Endkoordinate
  621.   LET b8y1|=a8y1|+1     ! 8-tel-Fähnchen, Linie b: y-Startkoordinate
  622.   '
  623.   LET x%=g_x%(g_n%)     ! Start-x-Wert des Notenfensters in einfachere Variable
  624.   LET y%=g_y%(g_n%)     ! Start-y-Wert des Notenfensters in einfachere Variable
  625.   ' ............................................................................
  626.   IF t|=0               ! F Kein Fähnchen verlangt:
  627.     GOTO r_faehnchen    ! verlasse unverrichteter Dinge die Prozedur
  628.   ENDIF                 ! EF kein Fähnchen verlangt
  629.   ' ............................................................................
  630.   '                     ! A c h t e l  -  F ä h n c h e n :
  631.   ' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
  632.   IF h|=0               ! F Notenhals unten:
  633.     LET x1%=x%+ax1|     ! links
  634.     LET y1%=y%+a8y1|    ! unten
  635.     LET x2%=x%+ax2|     ! rechts
  636.     LET y2%=y%+a8y2|    ! oben
  637.   ELSE IF h|=1          ! F Notenhals oben, Werte spiegeln:
  638.     LET x1%=x%+g_nb|-ax1| ! aus links wird rechts
  639.     LET y1%=y%+g_nzlh|-a8y1|! aus unten wird oben
  640.     LET x2%=x%+g_nb|-ax2| ! aus rechts wird links
  641.     LET y2%=y%+g_nzlh|-a8y2|! aus oben wird unten
  642.   ENDIF                 ! EFU Notenhals unten / oben
  643.   ' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
  644.   LINE x1%,y1%,x2%,y2%  ! 8-tel Notenfähnchen, Linie a malen
  645.   ' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
  646.   IF h|=0               ! F Notenhals unten:
  647.     LET x1%=x%+ax1|     ! links
  648.     LET y1%=y%+b8y1|    ! unten
  649.     LET x2%=x%+bx2|     ! rechts
  650.     LET y2%=y%+a8y2|    ! oben
  651.   ELSE IF h|=1          ! F Notenhals oben, Werte spiegeln:
  652.     LET x1%=x%+g_nb|-ax1| ! aus links wird rechts
  653.     LET y1%=y%+g_nzlh|-b8y1|! aus unten wird oben
  654.     LET x2%=x%+g_nb|-bx2| ! aus rechts wird links
  655.     LET y2%=y%+g_nzlh|-a8y2|! aus oben wird unten
  656.   ENDIF                 ! EF Notenhals oben
  657.   ' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
  658.   LINE x1%,y1%,x2%,y2%  ! 8-tel Notenfähnchen, Linie b malen
  659.   ' ............................................................................
  660.   IF t|=1               ! F Kein Fähnchen mehr verlangt:
  661.     GOTO r_faehnchen    ! verlasse nach getaner Arbeit die Prozedur
  662.   ENDIF                 ! EF kein Fähnchen mehr verlangt
  663.   ' ............................................................................
  664.   '                     ! S e c h z e h n t e l  -  F ä h n c h e n :
  665.   ' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
  666.   IF h|=0               ! F Notenhals unten:
  667.     LET x1%=x%+ax1|     ! links
  668.     LET y1%=y%+a16y1|   ! unten
  669.     LET x2%=x%+ax2|     ! rechts
  670.     LET y2%=y%+a16y2|   ! oben
  671.   ELSE IF h|=1          ! F Notenhals oben, Werte spiegeln:
  672.     LET x1%=x%+g_nb|-ax1| ! aus links wird rechts
  673.     LET y1%=y%+g_nzlh|-a16y1|! aus unten wird oben
  674.     LET x2%=x%+g_nb|-ax2| ! aus rechts wird links
  675.     LET y2%=y%+g_nzlh|-a16y2|! aus oben wird unten
  676.   ENDIF                 ! EFU Notenhals unten / oben
  677.   ' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
  678.   LINE x1%,y1%,x2%,y2%  ! 16-tel Notenfähnchen, Linie a malen
  679.   ' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
  680.   IF h|=0               ! F Notenhals unten:
  681.     LET x1%=x%+ax1|     ! links
  682.     LET y1%=y%+b16y1|   ! unten
  683.     LET x2%=x%+bx2|     ! rechts
  684.     LET y2%=y%+a16y2|   ! oben
  685.   ELSE IF h|=1          ! F Notenhals oben, Werte spiegeln:
  686.     LET x1%=x%+g_nb|-ax1| ! aus links wird rechts
  687.     LET y1%=y%+g_nzlh|-b16y1|! aus unten wird oben
  688.     LET x2%=x%+g_nb|-bx2| ! aus rechts wird links
  689.     LET y2%=y%+g_nzlh|-a16y2|! aus oben wird unten
  690.   ENDIF                 ! EF Notenhals oben
  691.   ' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
  692.   LINE x1%,y1%,x2%,y2%  ! 16-tel Notenfähnchen, Linie b malen
  693.   ' ............................................................................
  694.   IF t|=2               ! F Kein Fähnchen mehr verlangt:
  695.     GOTO r_faehnchen    ! verlasse nach getaner Arbeit die Prozedur
  696.   ENDIF                 ! EF kein Fähnchen mehr verlangt
  697.   ' ............................................................................
  698.   '                     ! Z w e i u n d d r e i ß i g s t e l - F ä h n c h e n
  699.   ' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
  700.   IF h|=0               ! F Notenhals unten:
  701.     LET x1%=x%+ax1|     ! links
  702.     LET y1%=y%+a32y1|   ! unten
  703.     LET x2%=x%+ax2|     ! rechts
  704.     LET y2%=y%+a32y2|   ! oben
  705.   ELSE IF h|=1          ! F Notenhals oben, Werte spiegeln:
  706.     LET x1%=x%+g_nb|-ax1| ! aus links wird rechts
  707.     LET y1%=y%+g_nzlh|-a32y1|! aus unten wird oben
  708.     LET x2%=x%+g_nb|-ax2| ! aus rechts wird links
  709.     LET y2%=y%+g_nzlh|-a32y2|! aus oben wird unten
  710.   ENDIF                 ! EFU Notenhals unten / oben
  711.   ' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
  712.   LINE x1%,y1%,x2%,y2%  ! 32-tel Notenfähnchen, Linie a malen
  713.   ' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
  714.   IF h|=0               ! F Notenhals unten:
  715.     LET x1%=x%+ax1|     ! links
  716.     LET y1%=y%+b32y1|   ! unten
  717.     LET x2%=x%+bx2|     ! rechts
  718.     LET y2%=y%+a32y2|   ! oben
  719.   ELSE IF h|=1          ! F Notenhals oben, Werte spiegeln:
  720.     LET x1%=x%+g_nb|-ax1| ! aus links wird rechts
  721.     LET y1%=y%+g_nzlh|-b32y1|! aus unten wird oben
  722.     LET x2%=x%+g_nb|-bx2| ! aus rechts wird links
  723.     LET y2%=y%+g_nzlh|-a32y2|! aus oben wird unten
  724.   ENDIF                 ! EF Notenhals oben
  725.   ' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
  726.   LINE x1%,y1%,x2%,y2%  ! 32-tel Notenfähnchen, Linie b malen
  727.   ' ............................................................................
  728.   r_faehnchen:          ! Label zum vorzeitigen Verlassen der Prozedur
  729.   ' ----------------------------------------------------------------------------
  730. RETURN
  731. > PROCEDURE 2_noten_foto(l|,v|,t|)!_:
  732.   ' ----------------------------------------------------------------------------
  733.   ' l|                  ! Notenhals unten:=0, oben:=1
  734.   ' v|                  ! vertikale, logische Position des Negativs
  735.   ' t|                  ! Fähnchenanzahl
  736.   ' ----------------------------------------------------------------------------
  737.   LOCAL d|              ! physikalische Vertikalposition
  738.   LOCAL h|              ! Zwischenspeicher für Notenzeilenhöhe minus 1
  739.   LOCAL nb|             ! Zwischenspeicher für Notenbreite
  740.   LOCAL a$              ! Bildschirmzwischenspeicher brauchts wegen Hilfslinien
  741.   ' ............................................................................
  742.   '                     ! N o t e n b i l d s p e i c h e r :
  743.   ' g_nb$(g_tha|,g_tpa|,1,1) ! Notenbildspeicherarray, die Argumente sind:
  744.   '                     ! 1.) Tonhöhe (1-25) c1=1, c3=25
  745.   '                     ! 2.) Periodendauerkennziffer (0-3)
  746.   '                           0=1/4, 1=1/8, 2=1/16, 3=1/32
  747.   '                     ! 3.) Gebunden mit Vorgängernote ? (Ja=1,Nein=0)
  748.   '                     ! 4.) Betonte Note ? (Ja=1,Nein=0)
  749.   ' ............................................................................
  750.   LET rga%=-3           ! Richtiger Gebundenzeichenabstand: beim Spiegeln der
  751.   '                     ! Noten mit Hals nach unten (um die mit Hals nach oben
  752.   '                     ! zu erreichen) ist der Abstand zum unteren Rand in-
  753.   '                     ! korrekt und wird durch rga% korrigiert (s.a. Bild)
  754.   LET h|=g_nzlh|-2      ! Zwischenspeicher für Notenzeilenhöhe minus 2, weil:
  755.   '                     ! g_y%(?)+g_nzlh| bereits 1.Pkt v.nächstunteren Notenbe-
  756.   '                     ! reich, siehe auch Bild der Beispielnote!
  757.   LET nb|=g_nb|-1       ! Zwischenspeicher für Notenbreite,spart immer 2 Zeichen
  758.   SGET a$               ! Bildschirm retten
  759.   ' ............................................................................
  760.   IF l|=0               ! F Notenhals unten:
  761.     ' ..........................................................................
  762.     IF v|=1             ! F 1. logische Vertikalposition = h1, Noten fotograf.:
  763.       LET d|=8*(g_la|/2)! physikalische Vertikalposition festlegen
  764.       GET g_x%(1),g_y%(1)-d|,g_x%(1)+nb|,g_y%(1)+h|-d|,g_nb$(12,t|,0,0)
  765.       GET g_x%(2),g_y%(2)-d|,g_x%(2)+nb|,g_y%(2)+h|-d|,g_nb$(12,t|,1,0)
  766.       GET g_x%(3),g_y%(3)-d|,g_x%(3)+nb|,g_y%(3)+h|-d|,g_nb$(12,t|,0,1)
  767.       GET g_x%(4),g_y%(4)-d|,g_x%(4)+nb|,g_y%(4)+h|-d|,g_nb$(12,t|,1,1)
  768.     ELSE IF v|=2        ! F 2. logische Vertikalposition = c2, cis2
  769.       LET d|=7*(g_la|/2)! physikalische Vertikalposition festlegen
  770.       GET g_x%(1),g_y%(1)-d|,g_x%(1)+nb|,g_y%(1)+h|-d|,g_nb$(13,t|,0,0)
  771.       GET g_x%(2),g_y%(2)-d|,g_x%(2)+nb|,g_y%(2)+h|-d|,g_nb$(13,t|,1,0)
  772.       GET g_x%(3),g_y%(3)-d|,g_x%(3)+nb|,g_y%(3)+h|-d|,g_nb$(13,t|,0,1)
  773.       GET g_x%(4),g_y%(4)-d|,g_x%(4)+nb|,g_y%(4)+h|-d|,g_nb$(13,t|,1,1)
  774.       GET g_x%(5),g_y%(1)-d|,g_x%(5)+nb|,g_y%(5)+h|-d|,g_nb$(14,t|,0,0)
  775.       GET g_x%(6),g_y%(2)-d|,g_x%(6)+nb|,g_y%(6)+h|-d|,g_nb$(14,t|,1,0)
  776.       GET g_x%(7),g_y%(3)-d|,g_x%(7)+nb|,g_y%(7)+h|-d|,g_nb$(14,t|,0,1)
  777.       GET g_x%(8),g_y%(4)-d|,g_x%(8)+nb|,g_y%(8)+h|-d|,g_nb$(14,t|,1,1)
  778.     ELSE IF v|=3        ! F 3. logische Vertikalposition = d2, dis2
  779.       LET d|=6*(g_la|/2)! physikalische Vertikalposition festlegen
  780.       GET g_x%(1),g_y%(1)-d|,g_x%(1)+nb|,g_y%(1)+h|-d|,g_nb$(15,t|,0,0)
  781.       GET g_x%(2),g_y%(2)-d|,g_x%(2)+nb|,g_y%(2)+h|-d|,g_nb$(15,t|,1,0)
  782.       GET g_x%(3),g_y%(3)-d|,g_x%(3)+nb|,g_y%(3)+h|-d|,g_nb$(15,t|,0,1)
  783.       GET g_x%(4),g_y%(4)-d|,g_x%(4)+nb|,g_y%(4)+h|-d|,g_nb$(15,t|,1,1)
  784.       GET g_x%(5),g_y%(1)-d|,g_x%(5)+nb|,g_y%(5)+h|-d|,g_nb$(16,t|,0,0)
  785.       GET g_x%(6),g_y%(2)-d|,g_x%(6)+nb|,g_y%(6)+h|-d|,g_nb$(16,t|,1,0)
  786.       GET g_x%(7),g_y%(3)-d|,g_x%(7)+nb|,g_y%(7)+h|-d|,g_nb$(16,t|,0,1)
  787.       GET g_x%(8),g_y%(4)-d|,g_x%(8)+nb|,g_y%(8)+h|-d|,g_nb$(16,t|,1,1)
  788.     ELSE IF v|=4        ! F 4. logische Vertikalposition = e2
  789.       LET d|=5*(g_la|/2)! physikalische Vertikalposition festlegen
  790.       GET g_x%(1),g_y%(1)-d|,g_x%(1)+nb|,g_y%(1)+h|-d|,g_nb$(17,t|,0,0)
  791.       GET g_x%(2),g_y%(2)-d|,g_x%(2)+nb|,g_y%(2)+h|-d|,g_nb$(17,t|,1,0)
  792.       GET g_x%(3),g_y%(3)-d|,g_x%(3)+nb|,g_y%(3)+h|-d|,g_nb$(17,t|,0,1)
  793.       GET g_x%(4),g_y%(4)-d|,g_x%(4)+nb|,g_y%(4)+h|-d|,g_nb$(17,t|,1,1)
  794.     ELSE IF v|=5        ! F 5. logische Vertikalposition = f2, fis2
  795.       LET d|=4*(g_la|/2)! physikalische Vertikalposition festlegen
  796.       GET g_x%(1),g_y%(1)-d|,g_x%(1)+nb|,g_y%(1)+h|-d|,g_nb$(18,t|,0,0)
  797.       GET g_x%(2),g_y%(2)-d|,g_x%(2)+nb|,g_y%(2)+h|-d|,g_nb$(18,t|,1,0)
  798.       GET g_x%(3),g_y%(3)-d|,g_x%(3)+nb|,g_y%(3)+h|-d|,g_nb$(18,t|,0,1)
  799.       GET g_x%(4),g_y%(4)-d|,g_x%(4)+nb|,g_y%(4)+h|-d|,g_nb$(18,t|,1,1)
  800.       GET g_x%(5),g_y%(1)-d|,g_x%(5)+nb|,g_y%(5)+h|-d|,g_nb$(19,t|,0,0)
  801.       GET g_x%(6),g_y%(2)-d|,g_x%(6)+nb|,g_y%(6)+h|-d|,g_nb$(19,t|,1,0)
  802.       GET g_x%(7),g_y%(3)-d|,g_x%(7)+nb|,g_y%(7)+h|-d|,g_nb$(19,t|,0,1)
  803.       GET g_x%(8),g_y%(4)-d|,g_x%(8)+nb|,g_y%(8)+h|-d|,g_nb$(19,t|,1,1)
  804.     ELSE IF v|=6        ! F 6. logische Vertikalposition = g2, gis2
  805.       LET d|=3*(g_la|/2)! physikalische Vertikalposition festlegen
  806.       GET g_x%(1),g_y%(1)-d|,g_x%(1)+nb|,g_y%(1)+h|-d|,g_nb$(20,t|,0,0)
  807.       GET g_x%(2),g_y%(2)-d|,g_x%(2)+nb|,g_y%(2)+h|-d|,g_nb$(20,t|,1,0)
  808.       GET g_x%(3),g_y%(3)-d|,g_x%(3)+nb|,g_y%(3)+h|-d|,g_nb$(20,t|,0,1)
  809.       GET g_x%(4),g_y%(4)-d|,g_x%(4)+nb|,g_y%(4)+h|-d|,g_nb$(20,t|,1,1)
  810.       GET g_x%(5),g_y%(1)-d|,g_x%(5)+nb|,g_y%(5)+h|-d|,g_nb$(21,t|,0,0)
  811.       GET g_x%(6),g_y%(2)-d|,g_x%(6)+nb|,g_y%(6)+h|-d|,g_nb$(21,t|,1,0)
  812.       GET g_x%(7),g_y%(3)-d|,g_x%(7)+nb|,g_y%(7)+h|-d|,g_nb$(21,t|,0,1)
  813.       GET g_x%(8),g_y%(4)-d|,g_x%(8)+nb|,g_y%(8)+h|-d|,g_nb$(21,t|,1,1)
  814.     ELSE IF v|=7        ! F 7. logische Vertikalposition = a2, b2
  815.       @3_hilfslinie_a2  ! Hilfslinie fürs obere a malen
  816.       LET d|=2*(g_la|/2)! physikalische Vertikalposition festlegen
  817.       GET g_x%(1),g_y%(1)-d|,g_x%(1)+nb|,g_y%(1)+h|-d|,g_nb$(22,t|,0,0)
  818.       GET g_x%(2),g_y%(2)-d|,g_x%(2)+nb|,g_y%(2)+h|-d|,g_nb$(22,t|,1,0)
  819.       GET g_x%(3),g_y%(3)-d|,g_x%(3)+nb|,g_y%(3)+h|-d|,g_nb$(22,t|,0,1)
  820.       GET g_x%(4),g_y%(4)-d|,g_x%(4)+nb|,g_y%(4)+h|-d|,g_nb$(22,t|,1,1)
  821.       GET g_x%(5),g_y%(1)-d|,g_x%(5)+nb|,g_y%(5)+h|-d|,g_nb$(23,t|,0,0)
  822.       GET g_x%(6),g_y%(2)-d|,g_x%(6)+nb|,g_y%(6)+h|-d|,g_nb$(23,t|,1,0)
  823.       GET g_x%(7),g_y%(3)-d|,g_x%(7)+nb|,g_y%(7)+h|-d|,g_nb$(23,t|,0,1)
  824.       GET g_x%(8),g_y%(4)-d|,g_x%(8)+nb|,g_y%(8)+h|-d|,g_nb$(23,t|,1,1)
  825.       SPUT a$           ! ursprünglichen Bildschirm wiederherstellen
  826.     ELSE IF v|=8        ! F 8. logische Vertikalposition = h2
  827.       @3_hilfslinie_h2  ! Hilfslinie fürs obere h malen
  828.       LET d|=1*(g_la|/2)! physikalische Vertikalposition festlegen
  829.       GET g_x%(1),g_y%(1)-d|,g_x%(1)+nb|,g_y%(1)+h|-d|,g_nb$(24,t|,0,0)
  830.       GET g_x%(2),g_y%(2)-d|,g_x%(2)+nb|,g_y%(2)+h|-d|,g_nb$(24,t|,1,0)
  831.       GET g_x%(3),g_y%(3)-d|,g_x%(3)+nb|,g_y%(3)+h|-d|,g_nb$(24,t|,0,1)
  832.       GET g_x%(4),g_y%(4)-d|,g_x%(4)+nb|,g_y%(4)+h|-d|,g_nb$(24,t|,1,1)
  833.       SPUT a$           ! ursprünglichen Bildschirm wiederherstellen
  834.     ELSE IF v|=9        ! F 9. logische Vertikalposition = c3
  835.       @3_hilfslinie_a2  ! Hilfslinie fürs obere a malen
  836.       @3_hilfslinie_c3  ! untere Hilfslinie fürs obere c malen
  837.       LET d|=0*(g_la|/2)! physikalische Vertikalposition festlegen
  838.       GET g_x%(1),g_y%(1)-d|,g_x%(1)+nb|,g_y%(1)+h|-d|,g_nb$(25,t|,0,0)
  839.       GET g_x%(2),g_y%(2)-d|,g_x%(2)+nb|,g_y%(2)+h|-d|,g_nb$(25,t|,1,0)
  840.       GET g_x%(3),g_y%(3)-d|,g_x%(3)+nb|,g_y%(3)+h|-d|,g_nb$(25,t|,0,1)
  841.       GET g_x%(4),g_y%(4)-d|,g_x%(4)+nb|,g_y%(4)+h|-d|,g_nb$(25,t|,1,1)
  842.       SPUT a$           ! ursprünglichen Bildschirm wiederherstellen
  843.     ENDIF               ! EFU logische Vertikalpositionen 1-9: Hals unten
  844.     ' ..........................................................................
  845.   ELSE IF l|=1          ! F Notenhals oben:
  846.     ' ..........................................................................
  847.     IF v|=1             ! F 1. logische Vertikalposition = a1, b1
  848.       LET d%=rga%+5*(g_la|/2)! physikalische Vertikalposition festlegen
  849.       GET g_x%(9),g_y%(9)+d%,g_x%(9)+nb|,g_y%(9)+h|+d%,g_nb$(10,t|,0,0)
  850.       GET g_x%(10),g_y%(10)+d%,g_x%(10)+nb|,g_y%(10)+h|+d%,g_nb$(10,t|,1,0)
  851.       GET g_x%(11),g_y%(11)+d%,g_x%(11)+nb|,g_y%(11)+h|+d%,g_nb$(10,t|,0,1)
  852.       GET g_x%(12),g_y%(12)+d%,g_x%(12)+nb|,g_y%(12)+h|+d%,g_nb$(10,t|,1,1)
  853.       GET g_x%(13),g_y%(13)+d%,g_x%(13)+nb|,g_y%(13)+h|+d%,g_nb$(11,t|,0,0)
  854.       GET g_x%(14),g_y%(14)+d%,g_x%(14)+nb|,g_y%(14)+h|+d%,g_nb$(11,t|,1,0)
  855.       GET g_x%(15),g_y%(15)+d%,g_x%(15)+nb|,g_y%(15)+h|+d%,g_nb$(11,t|,0,1)
  856.       GET g_x%(16),g_y%(16)+d%,g_x%(16)+nb|,g_y%(16)+h|+d%,g_nb$(11,t|,1,1)
  857.     ELSE IF v|=2        ! F 2. logische Vertikalposition = g1, gis1
  858.       LET d%=rga%+4*(g_la|/2)! physikalische Vertikalposition festlegen
  859.       GET g_x%(9),g_y%(9)+d%,g_x%(9)+nb|,g_y%(9)+h|+d%,g_nb$(8,t|,0,0)
  860.       GET g_x%(10),g_y%(10)+d%,g_x%(10)+nb|,g_y%(10)+h|+d%,g_nb$(8,t|,1,0)
  861.       GET g_x%(11),g_y%(11)+d%,g_x%(11)+nb|,g_y%(11)+h|+d%,g_nb$(8,t|,0,1)
  862.       GET g_x%(12),g_y%(12)+d%,g_x%(12)+nb|,g_y%(12)+h|+d%,g_nb$(8,t|,1,1)
  863.       GET g_x%(13),g_y%(13)+d%,g_x%(13)+nb|,g_y%(13)+h|+d%,g_nb$(9,t|,0,0)
  864.       GET g_x%(14),g_y%(14)+d%,g_x%(14)+nb|,g_y%(14)+h|+d%,g_nb$(9,t|,1,0)
  865.       GET g_x%(15),g_y%(15)+d%,g_x%(15)+nb|,g_y%(15)+h|+d%,g_nb$(9,t|,0,1)
  866.       GET g_x%(16),g_y%(16)+d%,g_x%(16)+nb|,g_y%(16)+h|+d%,g_nb$(9,t|,1,1)
  867.     ELSE IF v|=3        ! F 3. logische Vertikalposition = f1, fis1
  868.       LET d%=rga%+3*(g_la|/2)! physikalische Vertikalposition festlegen
  869.       GET g_x%(9),g_y%(9)+d%,g_x%(9)+nb|,g_y%(9)+h|+d%,g_nb$(6,t|,0,0)
  870.       GET g_x%(10),g_y%(10)+d%,g_x%(10)+nb|,g_y%(10)+h|+d%,g_nb$(6,t|,1,0)
  871.       GET g_x%(11),g_y%(11)+d%,g_x%(11)+nb|,g_y%(11)+h|+d%,g_nb$(6,t|,0,1)
  872.       GET g_x%(12),g_y%(12)+d%,g_x%(12)+nb|,g_y%(12)+h|+d%,g_nb$(6,t|,1,1)
  873.       GET g_x%(13),g_y%(13)+d%,g_x%(13)+nb|,g_y%(13)+h|+d%,g_nb$(7,t|,0,0)
  874.       GET g_x%(14),g_y%(14)+d%,g_x%(14)+nb|,g_y%(14)+h|+d%,g_nb$(7,t|,1,0)
  875.       GET g_x%(15),g_y%(15)+d%,g_x%(15)+nb|,g_y%(15)+h|+d%,g_nb$(7,t|,0,1)
  876.       GET g_x%(16),g_y%(16)+d%,g_x%(16)+nb|,g_y%(16)+h|+d%,g_nb$(7,t|,1,1)
  877.     ELSE IF v|=4        ! F 4. logische Vertikalposition = e1
  878.       LET d%=rga%+2*(g_la|/2)! physikalische Vertikalposition festlegen
  879.       GET g_x%(9),g_y%(9)+d%,g_x%(9)+nb|,g_y%(9)+h|+d%,g_nb$(5,t|,0,0)
  880.       GET g_x%(10),g_y%(10)+d%,g_x%(10)+nb|,g_y%(10)+h|+d%,g_nb$(5,t|,1,0)
  881.       GET g_x%(11),g_y%(11)+d%,g_x%(11)+nb|,g_y%(11)+h|+d%,g_nb$(5,t|,0,1)
  882.       GET g_x%(12),g_y%(12)+d%,g_x%(12)+nb|,g_y%(12)+h|+d%,g_nb$(5,t|,1,1)
  883.     ELSE IF v|=5        ! F 5. logische Vertikalposition = d1, dis1
  884.       LET d%=rga%+1*(g_la|/2)! physikalische Vertikalposition festlegen
  885.       GET g_x%(9),g_y%(9)+d%,g_x%(9)+nb|,g_y%(9)+h|+d%,g_nb$(3,t|,0,0)
  886.       GET g_x%(10),g_y%(10)+d%,g_x%(10)+nb|,g_y%(10)+h|+d%,g_nb$(3,t|,1,0)
  887.       GET g_x%(11),g_y%(11)+d%,g_x%(11)+nb|,g_y%(11)+h|+d%,g_nb$(3,t|,0,1)
  888.       GET g_x%(12),g_y%(12)+d%,g_x%(12)+nb|,g_y%(12)+h|+d%,g_nb$(3,t|,1,1)
  889.       GET g_x%(13),g_y%(13)+d%,g_x%(13)+nb|,g_y%(13)+h|+d%,g_nb$(4,t|,0,0)
  890.       GET g_x%(14),g_y%(14)+d%,g_x%(14)+nb|,g_y%(14)+h|+d%,g_nb$(4,t|,1,0)
  891.       GET g_x%(15),g_y%(15)+d%,g_x%(15)+nb|,g_y%(15)+h|+d%,g_nb$(4,t|,0,1)
  892.       GET g_x%(16),g_y%(16)+d%,g_x%(16)+nb|,g_y%(16)+h|+d%,g_nb$(4,t|,1,1)
  893.     ELSE IF v|=6        ! F 6. logische Vertikalposition = c1, cis1
  894.       @3_hilfslinie_c1(rga%)  ! Hilfslinie fürs unterste c malen
  895.       LET d%=rga%+0*(g_la|/2)! physikalische Vertikalposition festlegen
  896.       GET g_x%(9),g_y%(9)+d%,g_x%(9)+nb|,g_y%(9)+h|+d%,g_nb$(1,t|,0,0)
  897.       GET g_x%(10),g_y%(10)+d%,g_x%(10)+nb|,g_y%(10)+h|+d%,g_nb$(1,t|,1,0)
  898.       GET g_x%(11),g_y%(11)+d%,g_x%(11)+nb|,g_y%(11)+h|+d%,g_nb$(1,t|,0,1)
  899.       GET g_x%(12),g_y%(12)+d%,g_x%(12)+nb|,g_y%(12)+h|+d%,g_nb$(1,t|,1,1)
  900.       GET g_x%(13),g_y%(13)+d%,g_x%(13)+nb|,g_y%(13)+h|+d%,g_nb$(2,t|,0,0)
  901.       GET g_x%(14),g_y%(14)+d%,g_x%(14)+nb|,g_y%(14)+h|+d%,g_nb$(2,t|,1,0)
  902.       GET g_x%(15),g_y%(15)+d%,g_x%(15)+nb|,g_y%(15)+h|+d%,g_nb$(2,t|,0,1)
  903.       GET g_x%(16),g_y%(16)+d%,g_x%(16)+nb|,g_y%(16)+h|+d%,g_nb$(2,t|,1,1)
  904.       SPUT a$           ! ursprünglichen Bildschirm wiederherstellen
  905.     ENDIF               ! EFU logische Vertikalpositionen 1-6: Hals oben
  906.     ' ..........................................................................
  907.   ENDIF                 ! EFU Notenhals unten / oben
  908.   ' ............................................................................
  909.   ' ----------------------------------------------------------------------------
  910. RETURN
  911. > PROCEDURE 2_pausen_foto(l|,t|)  !_:
  912.   ' ----------------------------------------------------------------------------
  913.   '                     ! Diese Prozedur ist der '2_noten_foto()' sehr ähnlich.
  914.   ' ............................................................................
  915.   ' l|                  ! Cursorpostion für die Pause ist wohl immer gleich=17
  916.   ' t|                  ! Fähnchenanzahl=Pausendauer
  917.   ' ............................................................................
  918.   LOCAL d|              ! physikalische Vertikalposition
  919.   LOCAL h|              ! Zwischenspeicher für Notenzeilenhöhe minus 1
  920.   LOCAL nb|             ! Zwischenspeicher für Notenbreite
  921.   ' ............................................................................
  922.   LET rga%=-3           ! Richtiger Gebundenzeichenabstand: beim Spiegeln der
  923.   '                     ! Noten mit Hals nach unten (um die mit Hals nach oben
  924.   '                     ! zu erreichen) ist der Abstand zum unteren Rand in-
  925.   '                     ! korrekt und wird durch rga% korrigiert (s.a. Bild)
  926.   LET h|=g_nzlh|-2      ! Zwischenspeicher für Notenzeilenhöhe minus 2, weil:
  927.   '                     ! g_y%(?)+g_nzlh| bereits 1.Pkt v.nächstunteren Notenber
  928.   LET nb|=g_nb|-1       ! Zwischenspeicher für Notenbreite,spart immer 2 Zeichen
  929.   ' ............................................................................
  930.   LET d%=rga%+5*(g_la|/2)! physikalische Vertikalposition festlegen
  931.   '                      ! Pause ohne Taktstrich, 'ungebunden':
  932.   GET g_x%(17),g_y%(17)+d%,g_x%(17)+nb|,g_y%(17)+h|+d%,g_nb$(26,t|,0,0)
  933.   '                      ! Pause ohne Taktstrich, 'gebunden':
  934.   GET g_x%(17),g_y%(17)+d%,g_x%(17)+nb|,g_y%(17)+h|+d%,g_nb$(26,t|,1,0)
  935.   '                      ! Pause mit Taktstrich, 'ungebunden':
  936.   GET g_x%(18),g_y%(18)+d%,g_x%(18)+nb|,g_y%(18)+h|+d%,g_nb$(26,t|,0,1)
  937.   '                      ! Pause mit Taktstrich, 'gebunden':
  938.   GET g_x%(18),g_y%(18)+d%,g_x%(18)+nb|,g_y%(18)+h|+d%,g_nb$(26,t|,1,1)
  939.   ' ----------------------------------------------------------------------------
  940. RETURN
  941. > PROCEDURE 3_hilfslinie_a2       !_:
  942.   ' ----------------------------------------------------------------------------
  943.   LOCAL ha2x|            ! Hilfslinie a2: x-Startkoordinate
  944.   LOCAL ha2y|            ! Hilfslinie a2: y-Startkoordinate
  945.   LOCAL hd|              ! Hilflinienbreite
  946.   LOCAL x1%              ! links
  947.   LOCAL y%               ! y-Koordinate
  948.   LOCAL x2%              ! rechts
  949.   ' ............................................................................
  950.   LET ha2x|=4            ! Hilfslinie a2: x-Startkoordinate
  951.   LET ha2y|=17           ! Hilfslinie a2: y-Startkoordinate
  952.   LET hd|=9              ! Hilflinienbreite
  953.   ' ............................................................................
  954.   FOR i|=1 TO 8          ! Alle Noten mit Hals nach unten durch
  955.     LET x1%=g_x%(i|)+ha2x|! links
  956.     LET y%=g_y%(i|)+ha2y|! y-Koordinate
  957.     LET x2%=x1%+hd|      ! rechts
  958.     LINE x1%,y%,x2%,y%   ! Hilfslinie malen
  959.   NEXT i|                ! Nächste Note mit Hals nach unten
  960.   ' ----------------------------------------------------------------------------
  961. RETURN
  962. > PROCEDURE 3_hilfslinie_h2       !_:
  963.   ' ----------------------------------------------------------------------------
  964.   LOCAL hh2x|            ! Hilfslinie h2: x-Startkoordinate
  965.   LOCAL hh2y|            ! Hilfslinie h2: y-Startkoordinate
  966.   LOCAL hd|              ! Hilflinienbreite
  967.   LOCAL x1%              ! links
  968.   LOCAL y%               ! y-Koordinate
  969.   LOCAL x2%              ! rechts
  970.   ' ............................................................................
  971.   LET hh2x|=4            ! Hilfslinie h2: x-Startkoordinate
  972.   LET hh2y|=20           ! Hilfslinie h2: y-Startkoordinate
  973.   LET hd|=9              ! Hilflinienbreite
  974.   ' ............................................................................
  975.   FOR i|=1 TO 8          ! Alle Noten mit Hals nach unten durch
  976.     LET x1%=g_x%(i|)+hh2x|! links
  977.     LET y%=g_y%(i|)+hh2y|! y-Koordinate
  978.     LET x2%=x1%+hd|      ! rechts
  979.     LINE x1%,y%,x2%,y%   ! Hilfslinie malen
  980.   NEXT i|                ! Nächste Note mit Hals nach unten
  981.   ' ----------------------------------------------------------------------------
  982. RETURN
  983. > PROCEDURE 3_hilfslinie_c3       !_:
  984.   ' ----------------------------------------------------------------------------
  985.   LOCAL hc3x|            ! Hilfslinie c3: x-Startkoordinate
  986.   LOCAL hc3y|            ! Hilfslinie c3: y-Startkoordinate
  987.   LOCAL hd|              ! Hilflinienbreite
  988.   LOCAL x1%              ! links
  989.   LOCAL y%               ! y-Koordinate
  990.   LOCAL x2%              ! rechts
  991.   ' ............................................................................
  992.   LET hc3x|=4            ! Hilfslinie c3: x-Startkoordinate
  993.   LET hc3y|=23           ! Hilfslinie c3: y-Startkoordinate
  994.   LET hd|=9              ! Hilflinienbreite
  995.   ' ............................................................................
  996.   FOR i|=1 TO 8          ! Alle Noten mit Hals nach unten durch
  997.     LET x1%=g_x%(i|)+hc3x|! links
  998.     LET y%=g_y%(i|)+hc3y|! y-Koordinate
  999.     LET x2%=x1%+hd|      ! rechts
  1000.     LINE x1%,y%,x2%,y%   ! Hilfslinie malen
  1001.   NEXT i|                ! Nächste Note mit Hals nach unten
  1002.   ' ----------------------------------------------------------------------------
  1003. RETURN
  1004. > PROCEDURE 3_hilfslinie_c1(yk%)  !_:
  1005.   ' ----------------------------------------------------------------------------
  1006.   ' yk%                  ! y-Korrekturfaktor (s.a. Bild unter 'rga%')
  1007.   ' ----------------------------------------------------------------------------
  1008.   LOCAL hc1x|            ! Hilfslinie c1: x-Startkoordinate
  1009.   LOCAL hc1y|            ! Hilfslinie c1: y-Startkoordinate
  1010.   LOCAL hd|              ! Hilflinienbreite
  1011.   LOCAL x1%              ! links
  1012.   LOCAL y%               ! y-Koordinate
  1013.   LOCAL x2%              ! rechts
  1014.   ' ............................................................................
  1015.   LET hc1x|=4            ! Hilfslinie c1: x-Startkoordinate
  1016.   LET hc1y|=59           ! Hilfslinie c1: y-Startkoordinate
  1017.   LET hd|=9              ! Hilflinienbreite
  1018.   ' ............................................................................
  1019.   FOR i|=9 TO 16         ! Alle Noten mit Hals nach oben durch
  1020.     LET x1%=g_x%(i|)+hc1x|! links
  1021.     LET y%=g_y%(i|)+hc1y|+yk%! y-Koordinate
  1022.     LET x2%=x1%+hd|      ! rechts
  1023.     LINE x1%,y%,x2%,y%   ! Hilfslinie malen
  1024.   NEXT i|                ! Nächste Note mit Hals nach oben
  1025.   ' ----------------------------------------------------------------------------
  1026. RETURN
  1027. ' ------------------------------------------------------------------------------
  1028. > PROCEDURE 1_notenlinien         !_:
  1029.   ' ----------------------------------------------------------------------------
  1030.   LOCAL n1y|                    ! Pos. 1.Notenlinie: g_y%(?)+n1y|
  1031.   LOCAL npz|                    ! Anzahl der Noten pro Zeile berechnen:
  1032.   LOCAL i|                      ! Notenzeilenzähler
  1033.   LOCAL j|                      ! Notenlinienzähler
  1034.   ' ............................................................................
  1035.   LET n1y|=29                   ! Pos. 1.Notenlinie: g_y%(?)+n1y|(s.a.'invers')
  1036.   LET npz|=g_bb%/(g_nb|)        ! Anzahl der Noten pro Zeile berechnen:
  1037.   ' ............................................................................
  1038.   FOR i|=1 TO g_za|             ! Alle Notenzeilen durch
  1039.     FOR j|=1 TO 5               ! Alle Notenlinien durch
  1040.       LET y%=g_y%(1+(i|-1)*npz|)+n1y|+(j|-1)*g_la| ! Notenlinien-y-Koordinate
  1041.       LINE 0,y%,g_bb%,y%        ! Notenlinie zeichnen
  1042.     NEXT j|                     ! nächste Notenlinie
  1043.   NEXT i|                       ! nächste Notenzeile
  1044.   ' ----------------------------------------------------------------------------
  1045. RETURN
  1046. > PROCEDURE 1_begrenzungslinien   !_:
  1047.   ' ----------------------------------------------------------------------------
  1048.   LOCAL npz|                    ! Anzahl der Noten pro Zeile berechnen:
  1049.   LOCAL i|                      ! Notenzeilenzähler
  1050.   ' ............................................................................
  1051.   LET npz|=g_bb%/(g_nb|)        ! Anzahl der Noten pro Zeile berechnen:
  1052.   ' ............................................................................
  1053.   FOR i|=1 TO g_za|             ! Alle Notenzeilen durch
  1054.     LET y%=g_y%(1+(i|-1)*npz|)-1! y-Koordinate der oberen Begrenzungslinie
  1055.     LINE 0,y%,g_bb%,y%          ! Obere Begrenzungslinie zeichnen
  1056.   NEXT i|                       ! Nächste Notenzeile
  1057.   ' ----------------------------------------------------------------------------
  1058. RETURN
  1059. > PROCEDURE 1_klaviatur           !_:
  1060.   ' ----------------------------------------------------------------------------
  1061.   LOCAL ntb|                    ! Notentastenbreite
  1062.   LOCAL ptb|                    ! Pausentastenbreite
  1063.   LOCAL i|                      ! Tastenzähler
  1064.   LOCAL x1%                     ! links
  1065.   LOCAL y1%                     ! oben
  1066.   LOCAL x2%                     ! rechts
  1067.   LOCAL y2%                     ! unten
  1068.   ' ............................................................................
  1069.   LET ntb|=g_ntb|               ! Notentastenbreite
  1070.   LET ptb|=g_ptb|               ! Pausentastenbreite
  1071.   LET y1%=0                     ! oben
  1072.   LET y2%=g_mh|-1               ! unten=Menühöhe-1
  1073.   ' ............................................................................
  1074.   FOR i|=1 TO g_tha|+1          ! Alle Notentasten durch
  1075.     LET x1%=ptb|+(i|-1)*ntb|    ! links
  1076.     LET x2%=ptb|+i|*ntb|        ! rechts
  1077.     LINE x1%,y1%,x1%,y2%        ! Tastenbegrenzung links
  1078.     '                           ! F schwarze Taste:
  1079.     IF i|=2 OR i|=4 OR i|=7 OR i|=9 OR i|=11 OR i|=14 OR i|=16 OR i|=19 OR i|=21 OR i|=23
  1080.       PBOX x1%,y1%,x2%,y2%      ! schwarze Taste malen
  1081.     ENDIF                       ! EF schwarze Taste
  1082.   NEXT i|                       ! nächste Notentaste
  1083.   ' ............................................................................
  1084.   BOUNDARY 0                    ! Rand ausschalten
  1085.   DEFFILL 1,2,4                 ! Muster für Pausentaste
  1086.   PBOX x1%+1,y1%,x1%+ptb|,y2%-1 ! Pausentaste rechts
  1087.   PBOX 0,y1%,ptb|-1,y2%-1       ! Pausentaste links
  1088.   DEFFILL 1,2,8                 ! Muster wieder schwarz
  1089.   BOUNDARY 1                    ! Rand wieder einschalten
  1090.   ' ............................................................................
  1091.   GET 0,0,g_bb%-1,g_mh|-1,g_kl$ ! Klaviatur fotografieren
  1092.   ' ----------------------------------------------------------------------------
  1093. RETURN
  1094. ' ------------------------------------------------------------------------------
  1095. > PROCEDURE 0_midi_vorbereiten    !_:
  1096.   ' ----------------------------------------------------------------------------
  1097.   IF g_midi!=TRUE                       ! F Midi ein:
  1098.     OUT 3,192,g_k1|                     ! Sound für Kanal 1
  1099.     OUT 3,193,g_k2|                     ! Sound für Kanal 2
  1100.     OUT 3,194,g_k3|                     ! Sound für Kanal 3
  1101.   ENDIF                                 ! d
  1102.   ' ----------------------------------------------------------------------------
  1103. RETURN
  1104. ' ------------------------------------------------------------------------------
  1105. > PROCEDURE 0_hauptfile_laden     !_:
  1106.   ' ----------------------------------------------------------------------------
  1107.   LOCAL dummy|                          ! Dummy für Alertbox
  1108.   LOCAL dummy%                          ! Dummy für RECALL-Befehl
  1109.   LOCAL m$                              ! Speicher für Filename
  1110.   ' ............................................................................
  1111.   IF (NOT EXIST(g_hf$)) OR g_w!         ! f Notenhauptdatei nicht auf Disk oder
  1112.     '                                   ! Wahlmöglichkeit erwünscht:
  1113.     FILESELECT "A:\*.NTN",m$,m$         ! Fileselectbox
  1114.     IF m$="" OR NOT EXIST(m$)           ! F Abbruch gewählt:
  1115.       @a_alert("Hauptfile wird im RAM neuangelegt!/ok!",dummy|)
  1116.       LET g_stueck$(0)=STRING$(g_stka|*8,"_")!Inhaltsverz. mit Leerz. auffüllen
  1117.       LET g_stueck$(1)=g_stueck$(0)         ! Datumteil
  1118.       FOR s%=2 TO g_stka|+1                 ! Alle Stücke durch
  1119.         LET g_stueck$(s%)=STRING$(800,"@")  ! Mit Leerzeichen auffüllen
  1120.       NEXT s%                               ! nächstes Stück
  1121.       GOTO raus_0_hauptfile_laden       ! d
  1122.     ELSE                                ! sonst:
  1123.       LET g_hf$=RIGHT$(m$,LEN(m$)-3)    ! 'A:\' wegschneiden
  1124.     ENDIF                               ! d
  1125.   ENDIF                                 ! d
  1126.   ' ............................................................................
  1127.   OPEN "I",#1,g_hf$                     ! Hauptnotenfile öffnen
  1128.   RECALL #1,g_stueck$(),-1,dummy%       ! Array laden
  1129.   CLOSE #1                              ! File schließen
  1130.   ' ............................................................................
  1131.   raus_0_hauptfile_laden:               ! d
  1132.   @1_fileselectboxfoto                  ! Fileselectbox fotografieren
  1133.   SPUT g_lb$                            ! Löschbildschirm
  1134.   PUT g_x%(g_n%),g_y%(g_n%),g_cs$,9     ! Cusor ein
  1135.   ' ............................................................................
  1136.   ' ----------------------------------------------------------------------------
  1137. RETURN
  1138. > PROCEDURE 1_fileselectboxfoto   !_:
  1139.   ' ----------------------------------------------------------------------------
  1140.   ' Hier wird die Fileselectbox angezeigt und fotografiert. Diese Prozedur wird
  1141.   ' auch von 'abspeichern' aus aufgerufen.
  1142.   ' ----------------------------------------------------------------------------
  1143.   LOCAL i|                                      ! Zählvariable
  1144.   LOCAL a|                                      ! Wahlvariable für Menü
  1145.   LOCAL m|                                      ! Maustastenvar. für Menü
  1146.   LOCAL c$                                      ! Bildschirmnegativ
  1147.   DIM a$(g_stka|)                               ! Menüeintragsfelderarray dim.
  1148.   DIM a%(g_stka|)                               ! Nummerierungsarray dim.
  1149.   ' ............................................................................
  1150.   SGET c$                                       ! Bildschirm retten
  1151.   ' ............................................................................
  1152.   SPUT g_lb$                                    ! Löschbild ausgeben, wichtig,
  1153.   '                                             ! weil diese Proc.auch von
  1154.   '                                             ! 'abspeichern' aus aufger.wird
  1155.   ' ............................................................................
  1156.   FOR i|=1 TO g_stka|                           ! Alle Menüeinträge durch
  1157.     LET a$(i|)=MID$(g_stueck$(0),(i|-1)*8+1,8)  ! Ins Menüeintragsfeld kopieren
  1158.     LET a%(i|)=i|                               ! Nummerierungsarrayeintrag
  1159.   NEXT i|                                       ! nächster Menüeintrag
  1160.   ' ............................................................................
  1161.   QSORT a$(),g_stka|+1,a%()                     ! Sortieren
  1162.   ' ............................................................................
  1163.   @a_menue(-1,0,0,0,0,-1,4,4,8,20,m|,a|,a$(),d!()) ! Menüprozedur aufrufen
  1164.   LET a|=a%(a|)                                 ! wirkliche Wahlnummer ermitteln
  1165.   ' ............................................................................
  1166.   SGET g_fsb$                                   ! Fileselectbox fotografieren
  1167.   ' ............................................................................
  1168.   SPUT c$                                       ! Bildschirm wieder herstellen
  1169.   ' ............................................................................
  1170.   ERASE a$()                                    ! Menüeintragsarray löschen
  1171.   ERASE a%()                                    ! Nummerierungsarray löschen
  1172.   ' ----------------------------------------------------------------------------
  1173. RETURN
  1174. ' ##############################################################################
  1175. '  N o t e n e i n g a b e :
  1176. ' ##############################################################################
  1177. > PROCEDURE 0_hauptschleife       !_:
  1178.   ' ----------------------------------------------------------------------------
  1179.   ' Dies ist die oberste Ebene des Hauptprogramms. In der Schleife wird erst
  1180.   ' eine Unterprozedur aufgerufen, die Nach Maus- und Tastatur fragt. Wurde
  1181.   ' dort eine Eingabe gemacht, geht's hier wieder weiter. Es wird untersucht,
  1182.   ' welcher der Befehle in der Tabelle (oder Helptaste) angesprochen wurde und
  1183.   ' daraufhin entsprechend verzweigt. Nach Beendigung des Befehls geht's dann
  1184.   ' wieder von vorne los, usw. bis zum bestätigten Befehl 'Programmende'.
  1185.   ' ----------------------------------------------------------------------------
  1186.   LOCAL t|      ! Help-Taste? Undo-Taste?
  1187.   LOCAL o|      ! - 2 Oktaven ?
  1188.   LOCAL x%      ! Maus-x-Koordinate
  1189.   LOCAL y%      ! Maus-y-Koordinate
  1190.   ' ----------------------------------------------------------------------------
  1191.   ' Achtung!  Erst Zeilen-, dann Spaltennummer ! ! !
  1192.   '
  1193.   '
  1194.   '              1.Spalte:    2.Spalte:    3.Spalte:    4.Spalte:    5.Spalte:
  1195.   '
  1196.   '            | linksoben  | Notentaste | rechtsoben | Notentext  | Cursor   |
  1197.   '
  1198.   '            |--------------------------------------------------------------|
  1199.   ' 1  LMT     | Pause      | 1/8 Note   | Pause      | Cursorpos. | Taktstr. |
  1200.   '            |------------+------------+------------+------------+----------|
  1201.   ' 2  RMT     | Hauptmenü  | Nur Ton    | Backspace  | Abspielen  | Fähnchen |
  1202.   '            |--------------------------------------------------------------|
  1203.   DO
  1204.     LET t|=0
  1205.     LET o|=0
  1206.     @1_a(x%,y%,o|,t|)
  1207.     IF t|=1
  1208.       @1_helptext
  1209.     ELSE IF t|=2
  1210.       @1_undo
  1211.     ELSE IF g_zs!(1,1) ! 1. Zeile: --------------------------------------------
  1212.       @1_write(0,x%)                    ! Pause
  1213.     ELSE IF g_zs!(1,2)
  1214.       @1_write(o|,x%)                   ! 1/8 Note
  1215.     ELSE IF g_zs!(1,3)
  1216.       @1_write(0,x%)                    ! Pause
  1217.     ELSE IF g_zs!(1,4)
  1218.       @1_neu_cpos(x%,y%)                ! Cursorpos.
  1219.     ELSE IF g_zs!(1,5)
  1220.       @1_takt_setzen                    ! Taktstr.
  1221.     ELSE IF g_zs!(2,1) ! 2. Zeile: --------------------------------------------
  1222.       @0_hauptmenue                     ! Hauptmenü
  1223.     ELSE IF g_zs!(2,2)
  1224.       @1_nur_ton(o|,x%)                 ! Nur Ton
  1225.     ELSE IF g_zs!(2,3)
  1226.       @1_backspace                      ! Backspace
  1227.     ELSE IF g_zs!(2,4)
  1228.       @1_spielen(x%,y%)                 ! Abspielen
  1229.     ELSE IF g_zs!(2,5)
  1230.       @1_faehnchen                      ! Fähnchen
  1231.     ENDIF
  1232.     ' ..........................................................................
  1233.   LOOP
  1234.   ' ----------------------------------------------------------------------------
  1235. RETURN
  1236. > PROCEDURE 1_a(VAR x%,y%,v|,k|)  !_:
  1237.   ' ----------------------------------------------------------------------------
  1238.   ' In dieser Prozedur werden Maus und Tastatur abgefragt auf:
  1239.   ' Maustasten, Mauskoordinaten, Alternate-Taste, Helptaste
  1240.   ' Die der Befehlstabelle (siehe 'hauptschleife' oder 'Dokumentation')
  1241.   ' entsprechenden Bedingungen werden abgefragt und die Ergebnisse in einem
  1242.   ' Boolean-Array zurückübergeben, das ist: g_zs!() .
  1243.   ' ----------------------------------------------------------------------------
  1244.   '
  1245.   ' x%                    ! Maus-x-Koordinate
  1246.   ' y%                    ! Maus-y-Koordinate
  1247.   ' v|                    ! Minuszweioktavenflag gesetzt ?
  1248.   ' k|                    ! =1 f Help-taste, =2 f Undotaste
  1249.   ' g_zs!()               ! Array für Befehlsanalyse
  1250.   '
  1251.   LOCAL lmt!              ! Linke Maustaste ?   -1=ja,  0=nein
  1252.   LOCAL rmt!              ! rechte Maustaste ?  -1=ja,  0=nein
  1253.   LOCAL jnb!              ! -1=Notenbereich 0=Klaviatur
  1254.   '
  1255.   LOCAL bs!               ! Bildschirm schwarz gewesen ?
  1256.   '
  1257.   LOCAL m|                ! Maustaste
  1258.   LOCAL dummy|            ! Bei Mausabfrage Tastaturinfo überflüssig
  1259.   LOCAL midi|             ! Midi-Code-Variable
  1260.   '
  1261.   LOCAL n%                ! Notennummer unterm Mauspfeil
  1262.   LOCAL t%                ! Zeitmesser für Bildschirmabschaltung
  1263.   '
  1264.   LOCAL r%                ! Speicher für Tastaturcode(Alt/Contr)von: BIOS(11,-1)
  1265.   '
  1266.   LOCAL mx%               ! X-Koordinate der Maus merken
  1267.   LOCAL my%               ! Y-Koordinate der Maus merken
  1268.   '
  1269.   LOCAL s$                ! Speicher für Tastaturcode (Help-Taste)
  1270.   '
  1271.   LOCAL a$                ! Negativspeicher für Bildschirmrettung
  1272.   '
  1273.   LOCAL m$                ! Midiinformation
  1274.   '
  1275.   DIM z!(5)               ! Zeilenarray
  1276.   DIM s!(5)               ! Spaltenarray
  1277.   ' ............................................................................
  1278.   '     1. )   M a u s -  u n d  T a s t a t u r a b f r a g e :
  1279.   ' ............................................................................
  1280.   SHOWM                   ! Mauspfeil zeigen
  1281.   ' ............................................................................
  1282.   REPEAT                  ! Warteschleife zum Entleeren von Maus-und Tast.puffer
  1283.     LET r%=BIOS(11,-1)    ! F noch Taste, in r% merken
  1284.   UNTIL MOUSEK=0 AND INKEY$="" AND r%<>2 AND r%<>16+2 ! es braucht inkey und r%
  1285.   ' r%=2 oder r%=16+2 bedeutet Shift (Backspace), das soll keine automatische
  1286.   ' Wiederholung bekommen, also stoppen.
  1287.   ' ............................................................................
  1288.   REPEAT                  ! Abfrageschleife,analysiert nur,ob Maus od.Tastatur:
  1289.     ' ..........................................................................
  1290.     '                     ! S c h w a r z s c h a l t u n g :
  1291.     INC t%                ! Zeitmesser raufsetzen
  1292.     IF t%=50000           ! F Zeit für Bildschirmabschaltung:
  1293.       HIDEM               ! Maus weg
  1294.       IF bs!=FALSE        ! F Bildschirm bisher noch nicht schwarz
  1295.         SGET a$           ! Bildschirm retten
  1296.       ENDIF               ! d
  1297.       PBOX 0,0,g_bb%-1,g_bh%-1! Bildschirm schwarz
  1298.       LET bs!=TRUE        ! Bildschirm schwarz merken
  1299.       LET t%=0            ! Weiterlaufen ohne Overflow, deshalb null setzen
  1300.     ENDIF                 ! d
  1301.     IF (mx%<>MOUSEX OR my%<>MOUSEY) AND bs!=TRUE! F Mausbewegung + Blds.schwarz
  1302.       LET t%=0            ! Weiterlaufen ohne Overflow
  1303.       LET bs!=FALSE       ! Bildschirm nicht mehr schwarz
  1304.       SPUT a$             ! Bildschirm wieder herstellen
  1305.       SHOWM               ! Maus her
  1306.     ENDIF                 ! d
  1307.     LET mx%=MOUSEX        ! X-Koordinate der Maus merken
  1308.     LET my%=MOUSEY        ! Y-Koordinate der Maus merken
  1309.     ' ..........................................................................
  1310.     '                     ! E n t g ü l t i g e  A b f r a g e :
  1311.     MOUSE x%,y%,m|        ! Mausdaten übermitteln
  1312.     LET s$=INKEY$         ! Taste ?
  1313.     LET m$=INPMID$        ! Midiinfo ?
  1314.     LET r%=BIOS(11,-1)    ! F zusätzliche Taste, in r% merken
  1315.     ' Alternate: 8, Shiftlinks: 2, Control:4  , bei CapsLock: +16, Shiftrechts:1
  1316.     IF ASC(s$)=97 OR ASC(s$)=65 ! F 'a' oder 'A' gedrückt: Stück spielen
  1317.       LET m|=2            ! linke Maustaste simulieren
  1318.       LET x%=g_x%(1)+1    ! x-Mauskoordinate auf 1.Note
  1319.       LET y%=g_y%(1)+1    ! y-Mauskoordinate auf 1.Note
  1320.     ENDIF                 ! d
  1321.     IF r%=2 OR r%=16+2    ! F Linksshift gedrückt: Wie Backspace=rechte Pausent.
  1322.       LET m|=2            ! rechte Maustaste simulieren
  1323.       LET x%=g_bb%-2      ! x-Mauskoordinate rechts simulieren
  1324.       LET y%=1            ! y-Mauskoordinate oben simulieren
  1325.     ENDIF                 ! d
  1326.     IF ASC(s$)=27         ! F "Esc"-Taste :Wie Hauptmenü=linke Pausentaste
  1327.       LET m|=2            ! rechte Maustaste simulieren
  1328.       LET x%=1            ! x-Mauskoordinate links simulieren
  1329.       LET y%=1            ! y-Mauskoordinate oben simulieren
  1330.     ENDIF                 ! d
  1331.     IF s$=" "             ! F Space gedrückt: Wie irgendeine Pausentaste
  1332.       LET m|=1            ! linke Maustaste simulieren
  1333.       LET x%=1            ! x-Mauskoordinate links simulieren
  1334.       LET y%=1            ! y-Mauskoordinate oben simulieren
  1335.     ENDIF                 ! d
  1336.     IF r%=4 OR r%=16+4    ! F Control gedrückt: Cursor nach links
  1337.       IF g_n%>1           ! F links von Cursor noch was ist:
  1338.         LET m|=1          ! linke Maustaste simulieren
  1339.         LET x%=g_x%(g_n%-1)+1 ! x-Mauskoordinate auf Note links v. akt. Cursor
  1340.         LET y%=g_y%(g_n%-1)+1 ! y-Mauskoordinate auf Note links v. akt. Cursor
  1341.       ELSE                ! F links vom Cursor nichts mehr ist:
  1342.         LET r%=0          ! Keine weitere Botschaft mehr
  1343.       ENDIF               ! d
  1344.     ENDIF                 ! d
  1345.     IF ASC(s$)=9 AND g_n%<g_os% ! F "Tab"-Taste gedrückt: Cursor nach rechts
  1346.       IF g_n%<g_os%       ! F rechts von Cursor noch was sein kann:
  1347.         LET m|=1          ! linke Maustaste simulieren
  1348.         LET x%=g_x%(g_n%+1)+1 ! x-Mauskoordinate auf Note links v. akt. Cursor
  1349.         LET y%=g_y%(g_n%+1)+1 ! y-Mauskoordinate auf Note links v. akt. Cursor
  1350.       ELSE                ! F rechts vom Cursor nichts mehr ist:
  1351.         LET s$=""         ! Keine weitere Botschaft mehr
  1352.       ENDIF               ! d
  1353.     ENDIF                 ! d
  1354.     ' ..........................................................................
  1355.     '                     ! B e i  M i d i  a u f r ä u m e n :
  1356.     IF m$<>"" AND (r%=8 OR r%=16+8)  ! F was in Midi kam und Alternate-Taste:
  1357.       IF RIGHT$(m$,1)="@" ! F letzte Meldung: Ton ein:
  1358.         LET m$=INPMID$    ! 'Ton aus'-Meldung holen
  1359.       ENDIF               ! d
  1360.       LET midi|=ASC(LEFT$(m$,1))  ! Tonhöhe feststellen
  1361.     ENDIF                 ! d
  1362.     ' ..........................................................................
  1363.   UNTIL m| OR s$<>"" OR midi|<>0     ! F Eingabe
  1364.   ' ............................................................................
  1365.   IF bs!                  ! F Bildschirm noch schwarz:
  1366.     SPUT a$               ! Bildschirm wieder herstellen
  1367.     SHOWM                 ! Maus her
  1368.   ENDIF                   ! d
  1369.   ' ............................................................................
  1370.   IF NOT g_midi!                        ! F kein Midi-Keyboard angeschlossen:
  1371.     WAVE 0,0                            ! Ton aus
  1372.   ELSE                                  ! F Midi-Keyboard angeschlossen
  1373.     OUT 3,128,g_mt1|,1                  ! alten Ton aus Kanal 1
  1374.     OUT 3,128,g_mt1|-24,1               ! alten Taktstrichton aus Kanal 1
  1375.     OUT 3,129,g_mt2|,1                  ! alten Ton aus Kanal 2
  1376.     OUT 3,130,g_perc|                   ! alten Ton aus Kanal 3
  1377.   ENDIF                                 ! d
  1378.   ' ............................................................................
  1379.   '     2. )  e r s t e  P e r i p h e r i e e i n g a b e a u s w e r t u n g :
  1380.   ' ............................................................................
  1381.   IF m$<>""                     ! F Midi-Eingabe
  1382.     IF midi|>59 AND midi|<59+26 ! F 'legale' Tonhöhe für Oktaven Nr. 3 und 4
  1383.       LET midi|=midi|-59        ! tonhöhe einsetzen
  1384.       LET x%=midi|*g_ntb|+g_ptb|-5     ! x-Koordinate für entsprechende Taste
  1385.       LET y%=1                  ! y-Koordinate für Klaviatur
  1386.       LET m|=1                  ! linke Maustaste simulieren
  1387.     ELSE IF midi|>35 AND midi|<60 ! F 'legale' Tonhöhe für Oktaven Nr. 1 und 2
  1388.       LET midi|=midi|-35        ! tonhöhe einsetzen
  1389.       LET x%=midi|*g_ntb|+g_ptb|-5     ! x-Koordinate für entsprechende Taste
  1390.       LET y%=1                  ! y-Koordinate für Klaviatur
  1391.       LET m|=1                  ! linke Maustaste simulieren
  1392.       LET v|=1                  ! Minuszweioktavenflag gesetzt
  1393.     ENDIF                       ! d
  1394.   ENDIF                         ! d
  1395.   ' ............................................................................
  1396.   LET lmt!=(2-m|)               ! Linke Maustaste ?
  1397.   LET rmt!=NOT lmt!             ! rechte Maustaste ?
  1398.   LET jnb!=(y%>g_mh|)           ! auf Notenbereich ?
  1399.   LET z!(1)=lmt!                !                                    Zeile [1]
  1400.   LET z!(2)=rmt!                !                                    Zeile [2]
  1401.   LET s!(1)=(NOT jnb!) AND (x%<g_ptb|) ! Linke Pausentaste ?         Spalte [a]
  1402.   LET s!(3)=(NOT jnb!) AND (x%>g_bb%-g_ptb|)  ! Rechte Pausentaste ? Spalte [c]
  1403.   LET s!(2)=(NOT jnb!) AND (NOT s!(1)) AND (NOT s!(3)) ! Notentaste ?Spalte [b]
  1404.   IF y%>g_mh|                   ! f Maus auf Notenbereich :
  1405.     @3_notenr(x%,y%,n%)         ! Welche Note liegt unter dem Mauspfeil?
  1406.     IF n%=g_n%                  ! F Cursor bereits auf Note unter Mauspfeil:
  1407.       LET s!(5)=TRUE            !                                    Spalte [e]
  1408.     ELSE                        ! F Cursor nicht auf Note unter Mauspfeil:
  1409.       LET s!(4)=TRUE            !                                    Spalte [d]
  1410.     ENDIF                       ! d
  1411.   ENDIF                         ! d
  1412.   ' ............................................................................
  1413.   '     3. )  Ü b e r g a b e p a r a m e t e r  s e t z e n :
  1414.   ' ............................................................................
  1415.   FOR i|=1 TO 2                 ! Alle Zeilen durch
  1416.     FOR j|=1 TO 5               ! Alle Spalten durch
  1417.       LET g_zs!(i|,j|)=z!(i|) AND s!(j|) ! Zeilen-Spalten-Array setzen
  1418.     NEXT j|                     ! Nächste Spalte
  1419.   NEXT i|                       ! Nächste Zeile
  1420.   IF (g_zs!(1,2) OR g_zs!(2,2)) AND (r%=1 OR r%=16+1)   ! F Rechtsshift gedrückt
  1421.     '                   ! und außerdem eine Note eingegeben wurde oder 'Nurton'
  1422.     LET v|=1            ! Minuszweioktavenflag gesetzt
  1423.   ENDIF                 ! d
  1424.   IF ASC(RIGHT$(s$,1))=98       ! [Help]-Taste gedrückt ?
  1425.     LET k|=1                    ! Übergabecode für diese Taste
  1426.   ELSE IF ASC(RIGHT$(s$,1))=97 AND LEN(s$)=2 ! [Undo]-Taste gedrückt ?
  1427.     LET k|=2                    ! Übergabecode für diese Taste
  1428.   ENDIF                         ! d
  1429.   ' ............................................................................
  1430.   ERASE z!(),s!()               ! Einzelfelder weg, sonst mehrfaches Dimens.
  1431.   ' ----------------------------------------------------------------------------
  1432. RETURN
  1433. ' ------------------------------------------------------------------------------
  1434. > PROCEDURE 1_helptext            !_:
  1435.   ' ----------------------------------------------------------------------------
  1436.   ' Hier wird der bereits im Vorbereitungsteil des Programms photographierte
  1437.   ' Hilfstext ausgegeben und auf einen Tastendruck gewartet
  1438.   ' ----------------------------------------------------------------------------
  1439.   LOCAL ft|                       ! Nr. des 1. falschen Takts
  1440.   LOCAL tn|                       ! Taktnummer des letzten Taktes
  1441.   LOCAL i|                        ! Zähler für Textarray
  1442.   LOCAL j|                        ! Zähler fürs Invertieren
  1443.   LOCAL d|                        ! Dauer einer Viertelnote in Sekunden
  1444.   LOCAL t%                        ! Zeitmeßvariable
  1445.   LOCAL s%                        ! Anzahl der schwarzen Tasten
  1446.   LOCAL w%                        ! Anzahl der weißen Tasten
  1447.   LOCAL a$                        ! Zwischenspeicher für Infotextzeile
  1448.   LOCAL b$                        ! Bildschirmnegativ zum Bildschirm retten
  1449.   LOCAL i$                        ! Infostring
  1450.   LOCAL t$                        ! Negativ für unteren Textteil fürsInvertieren
  1451.   LOCAL takt$                     ! Art des Takts
  1452.   DIM a$(20)                      ! Array für Infotext
  1453.   DIM n$(g_stka|)                 ! Array für Stücknamen
  1454.   ' ............................................................................
  1455.   LET d|=8                        ! Dauer einer Viertelnote in Zehntelsekunden
  1456.   '                               ! Muß duch 2^3=8 teilbar sein: 3 Fänchen mögl.
  1457.   SGET b$                         ! Bildschirm retten
  1458.   SPUT g_hp$                      ! Helptext ausgeben
  1459.   ' ............................................................................
  1460.   '     1.)  I n f o t e x t a r r a y  f ü l l e n :
  1461.   ' ............................................................................
  1462.   '          1234567890123456789012345678901234567890
  1463.   LET a$(1)="Freier Speicher in Bytes: '"+STR$(FRE(0))+"'"
  1464.   LET a$(2)="Name des aktuellen Stücks: '"+g_fn$+"'"
  1465.   FOR i|=1 TO g_stka|             ! Alle Menüeinträge durch (physikalisch)
  1466.     LET n$(i|)=MID$(g_stueck$(0),(i|-1)*8+1,8)    ! Namen festhalten
  1467.     IF g_fn$=n$(i|)               ! f Namen gefunden
  1468.       LET j|=i|                   ! Nummer des gefundenen Namens merken
  1469.     ENDIF                         ! d
  1470.   NEXT i|                         ! nächster Menüeintrag
  1471.   LET a$(3)="physikalische Nr. des Stückes: '"+STR$(j|)+"'"
  1472.   QSORT n$()                      ! Namen alph. sortieren
  1473.   FOR i|=1 TO g_stka|             ! Alle Menüeinträge durch (alphabetisch)
  1474.     EXIT IF g_fn$=n$(i|)          ! raus f Namen gefunden
  1475.   NEXT i|                         ! nächster Menüeintrag
  1476.   LET a$(4)="alphabetische Nr. des Stückes: '"+STR$(i|)+"'"
  1477.   @2_t(tn|,ft|,d|,t%)             ! Letzte Taktnr. und Nr. des 1.falschen Takts
  1478.   LET a$(5)="Nummer des letzten Taktes:' "+STR$(tn|)+"'"
  1479.   LET a$(6)="Nr. des ersten falschen Taktes: '"+STR$(ft|)+"'"
  1480.   LET a$(7)="1/4 Note dauert: '"+STR$(d|)+"'Zehntelsekunden"
  1481.   LET a$(8)="Dauer des Stücks in Zehntelsek.: '"+STR$(t%)+"'"
  1482.   LET a$(9)="Notenanzahl: '"+STR$(g_mn%)+"'"
  1483.   @2_shwtch(s%,w%,z!)             ! Mehr schwarze als weiße Tasten ?
  1484.   LET a$(10)="Anzahl der schwarzen Tasten: '"+STR$(s%)+"'"
  1485.   LET a$(11)="Anzahl der weißen Tasten:   '"+STR$(w%)+"'"
  1486.   LET a$(12)="Name des Hauptfiles: '"+g_hf$+"'"
  1487.   ' ............................................................................
  1488.   '     2.)  I n f o t e x t  a n z e i g e n :
  1489.   ' ............................................................................
  1490.   LET j|=0                        ! Inverszähler null
  1491.   FOR i|=1 TO 6                   ! Linke Spalte des Infotextes:
  1492.     INC j|                        ! Zähler fürs Invertieren
  1493.     IF ODD(j|)                    ! F j| ungerade:
  1494.       PRINT CHR$(27);CHR$(112);   ! Invers ein
  1495.     ELSE                          ! F j| gerade:
  1496.       PRINT CHR$(27);CHR$(113);   ! Invers aus
  1497.     ENDIF                         ! d
  1498.     LET a$=a$(i|)                 ! Infozeile übergeben
  1499.     LET a$=a$+SPACE$(40-LEN(a$))  ! Infozeile auf Länge von 40 erweitern
  1500.     PRINT AT(1,2+i|);a$;          ! Infozeile ausgeben
  1501.   NEXT i|                         ! nächste Zeile der linken Spalte des Infos
  1502.   LET j|=0                        ! Inverszähler null
  1503.   FOR i|=7 TO 12                  ! Rechte Spalte des Infotextes:
  1504.     INC j|                        ! Zähler fürs Invertieren
  1505.     IF EVEN(j|)                   ! F j| gerade:
  1506.       PRINT CHR$(27);CHR$(113);   ! Invers aus
  1507.     ELSE                          ! F j| ungerade:
  1508.       PRINT CHR$(27);CHR$(112);   ! Invers ein
  1509.     ENDIF                         ! d
  1510.     LET a$=a$(i|)                 ! Infozeile übergeben
  1511.     LET a$=a$+SPACE$(40-LEN(a$))  ! Infozeile auf Länge von 40 erweitern
  1512.     PRINT AT(41,2+i|-6);a$;       ! Infozeile ausgeben
  1513.   NEXT i|                         ! nächste Zeile der rechten Spalte des Infos
  1514.   PRINT CHR$(27);CHR$(113);       ! Invers aus
  1515.   GET 0,18*16,g_bh%-1,g_bb%-1,t$  ! Unteren Textteil fotografieren
  1516.   PUT 0,18*16,t$,8                ! Invers ausgeben
  1517.   ' ............................................................................
  1518.   '     3.)  W a r t e n   a u f  T a s t e n d r u c k :
  1519.   ' ............................................................................
  1520.   REPEAT                          ! Warteschleife, damit's Bild erst mal bleibt:
  1521.   UNTIL INKEY$=""                 ! Erst Raus, wenn Puffer leer
  1522.   REPEAT                          ! Warteschleife
  1523.     PRINT AT(60,1);DATE$;"  ";TIME$ ! Datum + Uhrzeit ausgeben
  1524.   UNTIL MOUSEK OR INKEY$<>""      ! Raus, falls Taste gedrückt
  1525.   ' ............................................................................
  1526.   SPUT b$                         ! Bildschirm wiederherstellen
  1527.   ERASE a$()                      ! Array für Infotext löschen
  1528.   ERASE n$()                      ! Array für Stücknamen löschen
  1529.   ' ----------------------------------------------------------------------------
  1530. RETURN
  1531. > PROCEDURE 2_t(VAR tn|,ft|,d|,t%)!_:
  1532.   ' ----------------------------------------------------------------------------
  1533.   ' Hier wird die Nummer des ersten falschen Taktes, sowie die Nr. des letzten
  1534.   ' Taktes und die Gesamtdauer des Stücks in Zehntelssekunden ermittelt.
  1535.   ' ----------------------------------------------------------------------------
  1536.   ' ft|                           ! Nr. des 1. falschen Takts
  1537.   ' tn|                           ! Taktnummer, am Ende: Nr. des letzten Taktes
  1538.   ' d|                            ! Dauer einer Viertelnote in Sekunden
  1539.   ' t%                            ! Zeitmeßvariable
  1540.   '
  1541.   LOCAL b|                        ! Periodendauer der akt. Note
  1542.   LOCAL p|                        ! Betonungsmerker der akt. Note
  1543.   LOCAL i|                        ! Zähler für Stücknummerermittlung
  1544.   LOCAL i%                        ! Zähler für Zeitmessung
  1545.   ' ............................................................................
  1546.   LET tn|=1                       ! Mit erstem Takt anfangen
  1547.   FOR i%=1 TO g_mn%               ! Alle Noten durch
  1548.     ' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
  1549.     LET b|=VAL(MID$(g_n$(i%),2,1))!  Periode
  1550.     LET p|=VAL(RIGHT$(g_n$(i%),1))!  betont?
  1551.     ' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
  1552.     IF t%=3*(d|/2) AND p|=1       ! F Taktstrich und 3/8 bisher:
  1553.       LET takt$="3/8"             ! 3/8-Takt ist angesagt
  1554.     ELSE IF t%=4*(d|/2) AND p|=1  ! F Taktstrich und 4/8 bisher:
  1555.       LET takt$="4/8"             ! 4/8-Takt ist angesagt
  1556.     ENDIF                         ! EFU 3/8, 4/8
  1557.     ' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
  1558.     IF takt$="3/8" AND p|=1       ! F 3/8-Takt und akt. Note mit Taktstrich:
  1559.       IF t%-(tn|-1)*(3*(d|/2))<>3*(d|/2) AND ft|=0 ! F letzter Takt falsch
  1560.         LET ft|=tn|               ! Taktnr. des 1.falschen Takts merken
  1561.       ENDIF                       ! d
  1562.     ELSE IF takt$="4/8" AND p|=1  ! F 4/8-Takt und akt. Note mit Taktstrich:
  1563.       IF t%-(tn|-1)*(4*(d|/2))<>4*(d|/2) AND ft|=0 ! F letzter Takt falsch
  1564.         LET ft|=tn|               ! Taktnr. des 1.falschen Takts merken
  1565.       ENDIF                       ! d
  1566.     ENDIF                         ! EFU 3/8, 4/8
  1567.     ' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
  1568.     LET t%=t%+d|/(2^b|)           ! Notendauer bei 1/4=d sec.
  1569.     ' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
  1570.     IF p|=1                       ! F Taktstrich:
  1571.       INC tn|                     ! Taktnummer erhöhen
  1572.     ENDIF                         ! d
  1573.     ' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
  1574.   NEXT i%                         ! nächste Note
  1575.   ' ----------------------------------------------------------------------------
  1576. RETURN
  1577. > PROCEDURE 1_undo                !_:
  1578.   ' ----------------------------------------------------------------------------
  1579.   ' Falls im gu_n$()-Array sich ein Stück befindet, so wird es mit dem Stück im
  1580.   ' g_n$()-Arrray ausgetauscht.
  1581.   ' ............................................................................
  1582.   IF gu_mn%=0                   ! F gar kein Undostück da:
  1583.     GOTO raus_undo              ! raus
  1584.   ENDIF                         ! d
  1585.   ' ............................................................................
  1586.   SWAP g_mn%,gu_mn%             ! Stücklänge des Undostücks wird jetzt aktuell
  1587.   SWAP g_n$(),gu_n$()           ! Undostück wird jetzt aktuell
  1588.   SPUT g_lb$                    ! Löschbild
  1589.   IF g_mn%=g_os%                ! F 200 Noten
  1590.     LET g_n%=g_mn%              ! Cursor auf letzte Note
  1591.   ELSE                          ! sonst:
  1592.     LET g_n%=g_mn%+1            ! Notencursor hinter Stückende
  1593.   ENDIF                         ! d
  1594.   @2_stueck_ganz_zeigen         ! d
  1595.   LET g_bla%=0                  ! Blockanfang löschen
  1596.   LET g_ble%=0                  ! Blockende löschen
  1597.   PUT g_x%(g_n%),g_y%(g_n%),g_cs$,9 ! Cusor ein
  1598.   ' ............................................................................
  1599.   raus_undo:                    ! Rauslabel
  1600.   ' ----------------------------------------------------------------------------
  1601. RETURN
  1602. ' ------------------------------------------------------------------------------
  1603. > PROCEDURE 1_write(v|,x%)        !_:
  1604.   ' ----------------------------------------------------------------------------
  1605.   ' Es gibt zwei Möglichkeiten. Entweder der Editor befindet sich im Moment
  1606.   ' im Insertmodus (g_n%<g_mn%+1) oder im Endschreibmodus (g_n%=g_mn%+1). Ent-
  1607.   ' sprechend wird dann in die jeweiligen Unterprozeduren verzweigt.
  1608.   ' ............................................................................
  1609.   ' v|                     ! Minuszweioktavenflag gesetzt ?
  1610.   ' x%                     ! Koordinate der Maus auf der Klaviatur
  1611.   ' ----------------------------------------------------------------------------
  1612.   IF g_bla%=0 AND g_ble%=0 ! Nur schreiben, wenn keine Blockmarken existieren
  1613.     IF g_n%<g_mn%+1        ! F nicht Endschreibmodus, also Insertmodus
  1614.       @2_insert(v|,x%)     ! d
  1615.     ELSE                   ! F Endschreibmodus
  1616.       @2_endeschr(v|,x%)   ! d
  1617.     ENDIF                  ! EFU Insertmodus / Endschreibmodus
  1618.   ENDIF                    ! d
  1619.   ' ----------------------------------------------------------------------------
  1620. RETURN
  1621. > PROCEDURE 2_endeschr(v|,x%)     !_:
  1622.   ' ----------------------------------------------------------------------------
  1623.   ' Diese Prozedur wird im Endschreibmodus aufgerufen und sorgt dafür, daß die
  1624.   ' durch eine Klaviaturtaste vom Benutzer bereits festgelegte Note hinten am
  1625.   ' Notentextende angefügt wird.
  1626.   ' ----------------------------------------------------------------------------
  1627.   ' v|                              ! Minuszweioktavenflag gesetzt ?
  1628.   ' x%                              ! Koordinate der Maus auf der Klaviatur
  1629.   LOCAL f!                          ! Fehlerflag für Tonausgabe
  1630.   LOCAL h|                          ! Notentastennummer
  1631.   ' ............................................................................
  1632.   IF g_mn%>=g_os%                   ! F Nummer der letzten Note >=obere Schranke
  1633.     GOTO raus_endeschreiben         ! d
  1634.   ENDIF                             ! d
  1635.   ' ............................................................................
  1636.   IF x%<g_ptb| OR x%>g_bb%-g_ptb|   ! Pausentaste ?
  1637.     LET h|=26                       ! Pausencode
  1638.   ELSE                              ! Notentaste:
  1639.     LET h|=TRUNC((x%-g_ptb|)/g_ntb|)+1! Notentaste feststellen
  1640.   ENDIF                             ! d
  1641.   PUT g_x%(g_n%),g_y%(g_n%),g_cs$,9 ! Cusor aus
  1642.   PUT g_x%(g_n%),g_y%(g_n%),g_nb$(h|,1,v|,0),7      ! Note auf Bildschirm
  1643.   LET g_n$(g_n%)=CHR$(64+h|)+"1"+STR$(v|)+"0"       ! Note abspeichern
  1644.   LET g_proctest$="endeschr"        ! Name der aufrufenden Prozedur fürDebugging
  1645.   IF NOT g_midi!                    ! F kein Midi-Gerät angeschlossen
  1646.     @a_tonausgabe(f!)               ! d
  1647.   ENDIF                             ! endif
  1648.   IF g_n%<g_os%                     ! F akt. Notennummer < obere Schranke
  1649.     INC g_n%                        ! Notennummer=Cursorposition erhöhen
  1650.   ENDIF                             ! d
  1651.   INC g_mn%                         ! Nummer der letzten Note erhöhen
  1652.   PUT g_x%(g_n%),g_y%(g_n%),g_cs$,9 ! Cusor ein
  1653.   ' ............................................................................
  1654.   raus_endeschreiben:               ! d
  1655.   ' ----------------------------------------------------------------------------
  1656. RETURN
  1657. > PROCEDURE 2_insert(v|,x%)       !_:
  1658.   ' ----------------------------------------------------------------------------
  1659.   ' Bei Aufruf dieser Prozedur befindet sich der Editor momentan im Insert-
  1660.   ' modus, das heißt der Cursor steht nicht ganz am Notentextende auf dem Leer-
  1661.   ' platz hinter der letzten Note, sondern  a u f  irgendeiner Note. Dann wird
  1662.   ' die gewünschte, durch eine Klaviaturtaste vom Benutzer bereits festge-
  1663.   ' legte Note vor der Cursorposition im Notentext eingefügt.
  1664.   ' ----------------------------------------------------------------------------
  1665.   ' v|                              ! Vierteltonflag gesetzt ?
  1666.   ' x%                              ! Koordinate der Maus auf der Klaviatur
  1667.   LOCAL f!                          ! Fehlerflag für Tonausgabe
  1668.   LOCAL h|                          ! Notentastennummer
  1669.   ' ............................................................................
  1670.   IF g_mn%>=g_os%                   ! F Notenendnr>= maximale obere Schranke
  1671.     GOTO raus_insert                ! Prozedur unverrichteter Dinge verlassen
  1672.   ENDIF                             ! d
  1673.   ' ............................................................................
  1674.   IF x%<g_ptb| OR x%>g_bb%-g_ptb|   ! Pausentaste ?
  1675.     LET h|=26                       ! Pausencode
  1676.   ELSE                              ! Notentaste:
  1677.     LET h|=TRUNC((x%-g_ptb|)/g_ntb|)+1! Notentaste feststellen
  1678.   ENDIF                             ! d
  1679.   ' ............................................................................
  1680.   PUT g_x%(g_n%),g_y%(g_n%),g_cs$,9 ! Cusor aus
  1681.   ' ............................................................................
  1682.   '                                 ! Note im Notenspeicherstring einfügen:
  1683.   INSERT g_n$(g_n%)=CHR$(64+h|)+"1"+STR$(v|)+"0"
  1684.   INC g_mn%                         ! Nummer der letzten Note erhöhen
  1685.   @3_grafikinsert                   ! alles hinter & einschl.Cursor 1 weiter
  1686.   ' ............................................................................
  1687.   LET g_proctest$="insert"          ! Name der aufrufenden Prozedur fürDebugging
  1688.   IF NOT g_midi!                    ! F kein Midi-Gerät angeschlossen
  1689.     @a_tonausgabe(f!)               ! d
  1690.   ENDIF                             ! endif
  1691.   ' ............................................................................
  1692.   PUT g_x%(g_n%),g_y%(g_n%),g_nb$(h|,1,v|,0),7      ! Note auf Bildschirm
  1693.   ' ............................................................................
  1694.   INC g_n%                          ! Notennummer=Cursorposition erhöhen
  1695.   ' ............................................................................
  1696.   PUT g_x%(g_n%),g_y%(g_n%),g_cs$,9 ! Cusor ein
  1697.   ' ............................................................................
  1698.   raus_insert:                      ! d
  1699.   ' ----------------------------------------------------------------------------
  1700. RETURN
  1701. > PROCEDURE 3_grafikinsert        !_:
  1702.   ' ----------------------------------------------------------------------------
  1703.   ' In dieser Prozedur wird vor der akt. Cursorposition ein Leerplatz einge-
  1704.   ' fügt und alles, was dahinter ist, um eins weiter nach rechts gerückt.
  1705.   ' Achtung! : Insert im Speicherarray  v o r  Aufruf dieser Prozedur !! Das
  1706.   ' gilt auch für die Aktualisierung der letzten Notennummer: g_mn% !!
  1707.   ' Genauer:
  1708.   ' 1.) Erst wird in der aktuellen Zeile, in der sich der Cursor befindet, alles
  1709.   ' rechts vom Cursor einschließlich der Note auf der Cursorposition fotogra-
  1710.   ' fiert und eine Position weiter rechts wieder ausgegeben.
  1711.   ' Nun wir die Cursornote der aktuellen Zeile, die ja jetzt doppelt vorhanden
  1712.   ' ist, gelöscht und stattdessen ein Leerplatz dort ausgegeben.
  1713.   ' 2.) Dann werden alle Zeilen unterhalb der aktuellen Zeile auf einmal foto-
  1714.   ' grafiert und zwar so, daß rechts eine eine Note breite Spalte bleibt. Dieser
  1715.   ' Zeilenblock wird dann eine Position weiter rechts wieder ausgegeben.
  1716.   ' Nun wird die äußerst linke Notenspalte, die ja jetzt doppelt vorhanden ist,
  1717.   ' in einer FOR-NEXT-Schleife gelöscht und in derselben Schleife stattdessen
  1718.   ' die entsprechenden ersten Noten der jeweiligen Zeilen dort ausgegeben.
  1719.   ' ----------------------------------------------------------------------------
  1720.   LOCAL i|                      ! Zeilenzähler physikalisch
  1721.   LOCAL j|                      ! Zeilenzähler logisch
  1722.   LOCAL aktz|                   ! Aktuelle Zeile
  1723.   LOCAL x1%                     ! links
  1724.   LOCAL x2%                     ! rechts
  1725.   LOCAL y1%                     ! oben
  1726.   LOCAL y2%                     ! unten
  1727.   LOCAL x%                      ! x-Koordinate nach dem Verschieben
  1728.   LOCAL lnr%                    ! Linkenotennr: Notennr. der Note am link. Rand
  1729.   LOCAL n%                      ! irgendeine Note in der letzten Zeile
  1730.   ' ............................................................................
  1731.   LET aktz|=TRUNC((g_n%-1)/g_npz|)+1! Akt.Zeile=tr.(akt.Note-1/Noten proZeile)+1
  1732.   ' ............................................................................
  1733.   ' 1.)                         ! Jetzt die aktuelle Zeile (siehe auch Bild):
  1734.   ' ............................................................................
  1735.   LET x1%=g_x%(g_n%)            ! links
  1736.   LET x2%=g_bb%-g_nb|           ! rechts
  1737.   LET y1%=g_y%(g_n%)            ! oben
  1738.   LET y2%=y1%+g_nzlh|-1         ! unten: oben + Notenzeilenhöhe - 1
  1739.   GET x1%,y1%,x2%,y2%,a$        ! Alles rechts vom Cursor (einschl.) fotograf.
  1740.   LET x%=x1%+g_nb|              ! Neuer Wert links: um 1 Notenpos. weiter rechts
  1741.   PUT x%,y1%,a$                 ! Fotografierte Notenzeile 1 weiter recht ausgeb
  1742.   PUT x1%,y1%,g_lz$             ! Leerzeichen an Cursorposition ausgeben
  1743.   ' ............................................................................
  1744.   IF g_mn%<=aktz|*g_npz|        ! F Endnote <= letzte Note in aktueller Zeile
  1745.     GOTO raus_grafikinsert      ! raus,eigentlich müßte das die FOR-Schleife tun
  1746.   ENDIF                         ! d
  1747.   ' ............................................................................
  1748.   ' 2.)                         ! Jetzt die Zeilen unter der akt. (s.a. Bild):
  1749.   ' ............................................................................
  1750.   LET x1%=0                     ! Neue Linkskoordinate, Rechtsk. bleibt gleich
  1751.   LET y1%=g_y%((aktz|*g_npz|)+1)! oben y-Wert: (akt.Zeile*Zeilennot.anz) + 1
  1752.   LET y2%=g_bh%-1               ! unten: Bildschirmhöhe - 1
  1753.   GET x1%,y1%,x2%,y2%,a$        ! i|-te Notenzeile fotograf. außer Note rechts
  1754.   LET x%=x1%+g_nb|              ! Wert links: um eine Notenpos.weiter rechts
  1755.   PUT x%,y1%,a$                 ! Fotografierte Notenzeile 1 weiter recht ausgeb
  1756.   FOR i|=aktz| TO g_za|         ! Alle Zeilen unterhalb akt. Zeile(einschl)durch
  1757.     LET lnr%=i|*g_npz|+1        ! linke Note der i|-ten Zeile berr:
  1758.     '                           ! Notenanzahl pro Zeile * Term analog aktz|
  1759.     EXIT IF lnr%>g_mn%          ! raus, falls in der aktuellen Zeile nix mehr is
  1760.     LET a|=ASC(LEFT$(g_n$(lnr%),1))-64  ! linke Note der i|-ten Zeile: Tonhöhe
  1761.     LET b|=VAL(MID$(g_n$(lnr%),2,1))    ! linke Note der i|-ten Zeile: Periode
  1762.     LET c|=VAL(MID$(g_n$(lnr%),3,1))    ! linke Note der i|-ten Zeile: gebund.?
  1763.     LET d|=VAL(RIGHT$(g_n$(lnr%),1))    ! linke Note der i|-ten Zeile: betont?
  1764.     PUT g_x%(lnr%),g_y%(lnr%),g_lz$ ! In i|-ter Zle in 1.Spalte: Leerzeichen
  1765.     PUT g_x%(lnr%),g_y%(lnr%),g_nb$(a|,b|,c|,d|),7 ! linke Note der i|-ten
  1766.     '                           ! Zeile in i|-ter Zeile in 1. Spalte ausgeben
  1767.   NEXT i|                       ! nächste Zeile unterhalb akt. Zeile
  1768.   ' ............................................................................
  1769.   raus_grafikinsert:            ! Rauslabel
  1770.   ' ............................................................................
  1771.   '                     Originaler Text:        Text mit inserted space vor (s):
  1772.   '
  1773.   ' aktuelle Zeile            q r(s)t u         q r _ s t
  1774.   '    .                          .             u   .
  1775.   '    .                          .                 .
  1776.   '    .                          .   x             .
  1777.   ' i|-1 te Zeile:            a b c d e         x a b c d
  1778.   ' i| te Zeile:              f g h i j         e f g h i
  1779.   ' i|+1 te Zeile:            k l m n o         j k l m n
  1780.   '    .                          .             o   .
  1781.   '    .                          .                 .
  1782.   '    .                          .                 .
  1783.   ' i| te Zeile:              f g h i j         e f g h i
  1784.   '                           |_____|    --->     |_____|
  1785.   ' ----------------------------------------------------------------------------
  1786. RETURN
  1787. > PROCEDURE 1_neu_cpos(x%,y%)     !_:
  1788.   ' ----------------------------------------------------------------------------
  1789.   ' Hier wird die neue gewünschte Cursorposition ermittelt und der Cursor
  1790.   ' entsprechend neu positioniert.
  1791.   ' ----------------------------------------------------------------------------
  1792.   LOCAL n%              ! vorläufige Notennr
  1793.   LOCAL f!              ! Fehlerflag für Tonausgabe
  1794.   ' ............................................................................
  1795.   PUT g_x%(g_n%),g_y%(g_n%),g_cs$,9 ! Cusor aus
  1796.   @3_notenr(x%,y%,n%)   ! Welche Note liegt unter dem Mauspfeil?
  1797.   IF n%>=g_mn%+1        ! F vorl.Notennr > letzte Notennr + 1: Endschreibmodus:
  1798.     '                   ! d.h. der Cursor wird dann hinter der letzten Note sein
  1799.     LET g_n%=g_mn%+1    ! vorläufige Notennummer an entgültige Globalvar übergeb
  1800.   ELSE                  ! F es beim Insertmodus bleibt
  1801.     LET g_n%=n%         ! vorläufige Notennummer an entgültige Globalvar übergeb
  1802.     LET g_proctest$="neu_cpos"  ! Name der aufrufenden Prozedur fürDebugging
  1803.     @a_tonausgabe(f!)   ! geht eben nur f Note da, dh. g_n%<=g_mn%
  1804.   ENDIF                 ! d
  1805.   PUT g_x%(g_n%),g_y%(g_n%),g_cs$,9 ! Cusor ein
  1806.   ' ----------------------------------------------------------------------------
  1807. RETURN
  1808. > PROCEDURE 1_takt_setzen         !_:
  1809.   ' ----------------------------------------------------------------------------
  1810.   ' Es werden bei der aktuellen Note unter dem Cursor ein Taktstrich gesetzt
  1811.   ' bzw. gelöscht (wenn vorher schon einer da war.).
  1812.   ' ----------------------------------------------------------------------------
  1813.   LOCAL a|                              ! Tonhöhe
  1814.   LOCAL b|                              ! Periodendauer
  1815.   LOCAL c|                              ! - 2 Oktaven ?
  1816.   LOCAL d|                              ! Taktstrich ?
  1817.   LOCAL i|                              ! Zähler für die 4 Kombinationsmöglichk.
  1818.   ' ............................................................................
  1819.   IF g_bla%<>0 OR g_ble%<>0             ! F Blockmarken existieren:
  1820.     GOTO raus_takt_setzen               ! Raus
  1821.   ENDIF                                 ! d
  1822.   IF g_n%>g_mn%                         ! F Endschreibmodus:
  1823.     GOTO raus_takt_setzen               ! Raus
  1824.   ENDIF                                 ! d
  1825.   IF ASC(LEFT$(g_n$(g_n%),1))-64<0      ! F kaputte Tonhöhe
  1826.     GOTO raus_takt_setzen               ! Raus
  1827.   ENDIF                                 ! d
  1828.   ' ............................................................................
  1829.   LET a|=ASC(LEFT$(g_n$(g_n%),1))-64    ! Tonhöhe
  1830.   LET b|=VAL(MID$(g_n$(g_n%),2,1))      ! Periode
  1831.   LET c|=VAL(MID$(g_n$(g_n%),3,1))      ! - 2 Oktaven?
  1832.   LET d|=VAL(RIGHT$(g_n$(g_n%),1))      ! Taktstrich?
  1833.   ' ............................................................................
  1834.   IF d|=1                               ! F Taktstrich gesetzt:
  1835.     LET d|=0                            ! Taktstrich löschen
  1836.   ELSE                                  ! F Taktstrich nicht gesetzt:
  1837.     LET d|=1                            ! Taktstrich setzen
  1838.   ENDIF                                 ! d
  1839.   ' ............................................................................
  1840.   MID$(g_n$(g_n%),4,1)=STR$(d|)         ! Änderung abspeichern
  1841.   PUT g_x%(g_n%),g_y%(g_n%),g_cs$,9     ! Cusor aus
  1842.   PUT g_x%(g_n%),g_y%(g_n%),g_lz$       ! Leerzeichen an Cursorposition ausgeben
  1843.   PUT g_x%(g_n%),g_y%(g_n%),g_nb$(a|,b|,c|,d|),7      ! Note auf Bildschirm
  1844.   PUT g_x%(g_n%),g_y%(g_n%),g_cs$,9     ! Cusor ein
  1845.   ' ............................................................................
  1846.   raus_takt_setzen:                     ! Raus
  1847.   ' ----------------------------------------------------------------------------
  1848. RETURN
  1849. > PROCEDURE 3_notenr(x%,y%,VAR n%)!_:
  1850.   ' ----------------------------------------------------------------------------
  1851.   ' Hier wird ermittelt, welchen Koordinaten x% und y% welche Notennummer auf
  1852.   ' dem Bildschirm entsprechen.
  1853.   ' ----------------------------------------------------------------------------
  1854.   LOCAL aktz|                   ! Aktuelle Zeile
  1855.   LOCAL aktsp|                  ! Aktuelle Spalte
  1856.   ' ............................................................................
  1857.   LET aktz|=TRUNC((y%-g_mh|)/g_nzlh|)+1 ! Aktuelle Zeile berechnen:
  1858.   '                                     ! [(y%-Menühöhe)/Notenzeilenhöhe]+1
  1859.   LET aktsp|=TRUNC(x%/g_nb|)+1          ! Aktuelle Spalte berechnen:
  1860.   '                                     ! [x%/Notenbreite]+1
  1861.   LET n%=aktsp|+(aktz|-1)*g_npz|        ! Aktuelle Notennummer berechnen
  1862.   ' ----------------------------------------------------------------------------
  1863. RETURN
  1864. > PROCEDURE 1_nur_ton(v|,x%)      !_:
  1865.   ' ----------------------------------------------------------------------------
  1866.   ' Hier wird nur getönt, nichts gespeichert und nichts gezeichnet.
  1867.   ' ----------------------------------------------------------------------------
  1868.   LOCAL t|                          ! Notentastennummer
  1869.   ' ............................................................................
  1870.   LET t|=TRUNC((x%-g_ptb|)/g_ntb|)+1! Notentaste feststellen
  1871.   @a2_s(g_ls|,t|,v|,10)             ! Tonausgabe
  1872.   ' ----------------------------------------------------------------------------
  1873. RETURN
  1874. > PROCEDURE 1_backspace           !_:
  1875.   ' ----------------------------------------------------------------------------
  1876.   ' Hier wird die Note vor dem Cursor gelöscht, also nicht die unter ihm.
  1877.   ' ----------------------------------------------------------------------------
  1878.   IF g_bla%<>0 OR g_ble%<>0 OR g_n%=1! Nur Backspace,f keine Blockmarken&>1.Note
  1879.     GOTO raus_backspace             ! Prozedur unverrichteter Dinge verlassen
  1880.   ENDIF                             ! d
  1881.   ' ............................................................................
  1882.   PUT g_x%(g_n%),g_y%(g_n%),g_cs$,9 ! Cusor aus
  1883.   ' ............................................................................
  1884.   IF g_n%=g_mn%+1                   ! F Endschreibmodus eingeschaltet:
  1885.     DELETE g_n$(g_n%)               ! Note bei Cursorpos.imNotenspeicher löschen
  1886.     PUT g_x%(g_mn%),g_y%(g_mn%),g_lz$! Leerzeichen 1 vor Cursorposition ausgeben
  1887.     DEC g_mn%                       ! Nummer der letzten Note erniedrigen
  1888.   ELSE                              ! F Insertmodus eingeschaltet:
  1889.     DELETE g_n$(g_n%-1)             ! Note vor Cursorpos.imNotenspeicher löschen
  1890.     DEC g_mn%                       ! Nummer der letzten Note erniedrigen
  1891.     @2_grafikdelete                 ! alles hinter & einschl.Cursor 1 zurück
  1892.   ENDIF                             ! EFU Endschreibmodus / Insertmodus
  1893.   ' ............................................................................
  1894.   DEC g_n%                          ! Notennummer=Cursorposition erniedrigen
  1895.   ' ............................................................................
  1896.   PUT g_x%(g_n%),g_y%(g_n%),g_cs$,9 ! Cusor ein
  1897.   ' ............................................................................
  1898.   raus_backspace:                   ! d
  1899.   ' ----------------------------------------------------------------------------
  1900. RETURN
  1901. > PROCEDURE 2_grafikdelete        !_:
  1902.   ' ----------------------------------------------------------------------------
  1903.   ' In dieser Prozedur wird die Note vor der aktuellen Cursorposition gelöscht,
  1904.   ' d.h. alle Noten rechts vom Cursor, einschließlich der Note auf dem Cursor
  1905.   ' werden um eine Stelle nach links gerückt.
  1906.   ' Genauer:
  1907.   ' 1.) Erst wird in der aktuellen Zeile, in der sich der Cursor befindet, alles
  1908.   ' rechts vom Cursor einschließlich der Note auf der Cursorposition fotogra-
  1909.   ' fiert und eine Position weiter links wieder ausgegeben.
  1910.   ' 2.) Dann werden alle Zeilen unterhalb der aktuellen Zeile auf einmal foto-
  1911.   ' grafiert und zwar so, daß links eine eine Note breite Spalte bleibt. Dieser
  1912.   ' Zeilenblock wird dann eine Position weiter links wieder ausgegeben.
  1913.   ' Nun wird die äußerst rechte Notenspalte, die ja jetzt doppelt vorhanden ist,
  1914.   ' in einer FOR-NEXT-Schleife gelöscht und in derselben Schleife stattdessen
  1915.   ' die entsprechenden letzten Noten der jeweiligen Zeilen dort ausgegeben. D.h.
  1916.   ' Delete muß im Speicherstringarray bereits   v  o  r   Aufruf dieser Prozedur
  1917.   ' hier stattgefunden haben !! Das gilt auch für die Endnotennummer g_mn% !!!
  1918.   ' ----------------------------------------------------------------------------
  1919.   LOCAL i|                      ! Zeilenzähler physikalisch
  1920.   LOCAL j|                      ! Zeilenzähler logisch
  1921.   LOCAL aktz|                   ! Aktuelle Zeile
  1922.   LOCAL x1%                     ! links
  1923.   LOCAL x2%                     ! rechts
  1924.   LOCAL y1%                     ! oben
  1925.   LOCAL y2%                     ! unten
  1926.   LOCAL x%                      ! x-Koordinate nach dem Verschieben
  1927.   LOCAL enr%                    ! Linksnotennr: Notennr. der Note am rechtenRand
  1928.   LOCAL n%                      ! irgendeine Note in der nächsten Zeile
  1929.   ' ............................................................................
  1930.   LET aktz|=TRUNC((g_n%-1)/g_npz|)+1! Akt.Zeile=tr.(akt.Note-1/Noten proZeile)+1
  1931.   ' ............................................................................
  1932.   ' 1.)                         ! Jetzt die aktuelle Zeile (siehe auch Bild):
  1933.   ' ............................................................................
  1934.   LET x1%=g_x%(g_n%)            ! links
  1935.   LET x2%=g_bb%-1               ! rechts=rechter Bildschirmrand
  1936.   LET y1%=g_y%(g_n%)            ! oben
  1937.   LET y2%=y1%+g_nzlh|-1         ! unten: oben + Notenzeilenhöhe - 1
  1938.   IF g_n%-1+g_npz|=aktz|*g_npz| ! F Cursor auf 1. Spalte:
  1939.     DEC aktz|                   ! Bei 2.) 1 Zeile früher anfangen
  1940.   ELSE                          ! F Cursor nicht auf 1. Spalte:
  1941.     GET x1%,y1%,x2%,y2%,a$      ! Alles rechts vom Cursor (einschl.) fotograf.
  1942.     LET x%=x1%-g_nb|            ! Neuer Wert links: um 1 Notenpos. links zurück
  1943.     PUT x%,y1%,a$               ! Fotografierte Notenzeile 1 weiter links ausgeb
  1944.   ENDIF                         ! EFU Cursor auf / nicht auf  1. Spalte
  1945.   ' ............................................................................
  1946.   IF g_mn%<aktz|*g_npz|         ! F Endnote < letzte Note in aktueller Zeile
  1947.     '                           ! Warum nicht <= ? Weil im Speicherstringarray
  1948.     '                           ! bereits Delete gemacht wurde und Gleichheit
  1949.     '                           ! somit bedeutet, daß vor Backspace nicht die
  1950.     '                           ! Gleichheit galt, sondern g_mn%=aktz|*g_npz|+1!
  1951.     '                           ! Dh. in der unteren Zeile war noch eine Note
  1952.     '                           ! und die muß ja auch noch gelöscht werden, die
  1953.     '                           ! IF-Bedingung darf also nicht erfüllt sein.
  1954.     PUT x2%-g_nb|,y1%,g_lz$     ! Leerzeichen am rechten Zeilenrand ausgeben
  1955.     GOTO raus_grafikdelete      ! Prozedur verlassen
  1956.   ENDIF                         ! EF Endnote <= letzte Note in aktueller Zeile
  1957.   ' ............................................................................
  1958.   ' 2.)                         ! Jetzt die Zeilen unter der akt. (s.a. Bild):
  1959.   ' ............................................................................
  1960.   LET x1%=g_nb|                 ! Neue Linkskoordinate, Rechtsk. bleibt gleich
  1961.   LET y1%=g_y%((aktz|*g_npz|)+1)! oben y-Wert: (akt.Zeile*Zeilennot.anz) + 1
  1962.   LET x2%=g_bb%-1               ! rechts=rechter Bildschirmrand
  1963.   LET y2%=g_bh%-1               ! unten: Bildschirmhöhe - 1
  1964.   GET x1%,y1%,x2%,y2%,a$        ! Notenzeilenblock fotograf. außer Note rechts
  1965.   LET x%=0                      ! Neuer wert links: Notenzeilenanfang
  1966.   PUT x%,y1%,a$                 ! Fotografierter Zeilenblock1 weiter links ausg
  1967.   ' ..........................................................................
  1968.   FOR i|=aktz| TO g_za|         ! Zeilen unterhalb akt. Zeile (einschl.) durch
  1969.     ' ..........................................................................
  1970.     LET enr%=i|*g_npz|          ! Endnotennr der i|-ten Zeile berr:
  1971.     '                           ! Aktuelle Zeile * Notenanzahl pro Zeile
  1972.     EXIT IF enr%>g_mn%          ! Raus f Endnotennr > Nr. letzter Note
  1973.     LET a|=ASC(LEFT$(g_n$(enr%),1))-64  ! Endnote d. i|-ten Zle: Tonhöhe
  1974.     LET b|=VAL(MID$(g_n$(enr%),2,1))    ! Endnote d. i|-ten Zle: Periode
  1975.     LET c|=VAL(MID$(g_n$(enr%),3,1))    ! Endnote d. i|-ten Zle: gebund.?
  1976.     LET d|=VAL(RIGHT$(g_n$(enr%),1))    ! Endnote d. i|-ten Zle: betont?
  1977.     LET y1%=g_y%(enr%)          ! oben y-Wert der Endnote
  1978.     PUT x2%-g_nb|,y1%,g_lz$     ! Leerzeichen am rechten Zeilenrand ausgeben
  1979.     PUT g_x%(enr%),g_y%(enr%),g_nb$(a|,b|,c|,d|),7 ! Endnote d.i|-ten Zle
  1980.     '                           ! in akt. Zeile an letzter Stelle ausgeben
  1981.     ' ..........................................................................
  1982.   NEXT i|                       ! nächste Zeile unterhalb akt. Zeile
  1983.   PUT x2%-g_nb|,g_y%(enr%),g_lz$ ! Leerzeichen am rechten Zeilenrand ausgeben
  1984.   raus_grafikdelete:            ! Rauslabel
  1985.   ' ............................................................................
  1986.   '                     Originaler Text:        Text nach delete von r
  1987.   '
  1988.   ' aktuelle Zeile            q r(s)t u         q(s)t u v
  1989.   '    .                      v   .                 .
  1990.   '    .                          .                 .
  1991.   '    .                          .                 .   a
  1992.   ' i|-1 te Zeile:            a b c d e         b c d e f
  1993.   ' i| te Zeile:              f g h i j         g h i j k
  1994.   ' i|+1 te Zeile:            k l m n o         l m n o p
  1995.   '    .                      p   .                 .
  1996.   '    .                          .                 .
  1997.   '    .                          .                 .
  1998.   ' i| te Zeile:              f g h i j         g h i j k
  1999.   '                             |_____|   --->  |_____|
  2000.   ' ----------------------------------------------------------------------------
  2001. RETURN
  2002. > PROCEDURE 1_spielen(x%,y%)      !_:
  2003.   ' ----------------------------------------------------------------------------
  2004.   ' Führ den Befehl der rechten Maustaste (ohne Alternate-Taste) aus: Von
  2005.   ' der Note unter dem Mauspfeil bis zur Note unterhalb des Cursors soll ge-
  2006.   ' spielt werden, bzw. umgekehrt, falls eine Note hinter dem Cursor ange-
  2007.   ' klickt wurde.
  2008.   ' ----------------------------------------------------------------------------
  2009.   LOCAL q|              ! Startnote
  2010.   LOCAL r|              ! Endnote
  2011.   LOCAL n%              ! vorläufige Notennr
  2012.   ' ............................................................................
  2013.   @3_notenr(x%,y%,n%)   ! Welche Note liegt unter dem Mauspfeil?
  2014.   ' ............................................................................
  2015.   IF n%>g_mn%           ! F vorl.Notennr > letzte Notennr:
  2016.     GOTO raus_spielen   ! Spielen zwecklos, raus!
  2017.   ENDIF                 ! d
  2018.   IF n%>g_n%            ! F Mauspfeilnote > Cursornote
  2019.     LET q|=g_n%         ! Startnote = Cursornote
  2020.     LET r|=n%           ! Endnote = Mauspfeilnote
  2021.   ELSE                  ! F Mauspfeilnote <= Cursornote
  2022.     LET q|=n%           ! Startnote = Mauspfeilnote
  2023.     LET r|=g_n%         ! Endnote = Cursornote
  2024.   ENDIF                 ! EFU Mauspfeilnote > / <= Cursornote
  2025.   IF q|>g_mn%           ! F Start > letzte existierende Note
  2026.     LET q|=g_mn%        ! setze Startnote = letzte existierende Note
  2027.   ENDIF                 ! d
  2028.   IF r|>g_mn%           ! F Endnote > letzte existierende Note
  2029.     LET r|=g_mn%        ! setze Endnote = letzte existierende Note
  2030.   ENDIF                 ! d
  2031.   ' ............................................................................
  2032.   @2_abspielen(q|,r|)   ! Von Note q| bis Note r| spielen
  2033.   ' ............................................................................
  2034.   raus_spielen:         ! Rauslabel
  2035.   ' ----------------------------------------------------------------------------
  2036. RETURN
  2037. > PROCEDURE 2_abspielen(q|,r|)    !_:
  2038.   ' ----------------------------------------------------------------------------
  2039.   ' Hier wird von der Note q| bis zur Note r| gespielt.
  2040.   ' ----------------------------------------------------------------------------
  2041.   LOCAL f!                        ! Fehlerflag für Tonausgabe
  2042.   LOCAL dw!                       ! Dauerwiederholvorgabe
  2043.   LOCAL b|                        ! Periodendauer
  2044.   LOCAL mg_n%                     ! Merker für Cursorposition
  2045.   LOCAL k%                        ! Tastencode
  2046.   ' ............................................................................
  2047.   @3_soundwahl                    ! Sound bei Midi-Keyboard einstellen
  2048.   LET b|=VAL(MID$(g_n$(g_mn%),2,1))     ! Periode der letzten Note
  2049.   IF b|=3 AND g_mn%>3 AND g_mn%-r|<3    ! F letzte Note 1/32 und > 3 Noten da:
  2050.     LET r|=r|-2                   ! Soundmarkierungen beim Abspielen weglassen
  2051.   ENDIF                           ! d
  2052.   ' ............................................................................
  2053.   LET mg_n%=g_n%                  ! Cursorposition merken
  2054.   ' ............................................................................
  2055.   REPEAT            ! Warteschleife für Mauseingabe:
  2056.   UNTIL MOUSEK=0    ! Erst Raus,wenn Maus nix mehr meldet,also Puffer leer
  2057.   ' ............................................................................
  2058.   PUT g_x%(g_n%),g_y%(g_n%),g_cs$,9 ! Cusor aus
  2059.   ' ............................................................................
  2060.   REPEAT                          ! Dauerwiederholschleife
  2061.     ' ..........................................................................
  2062.     FOR g_n%=q| TO r|             ! Alle zu spielenden Noten durch
  2063.       ' ........................................................................
  2064.       IF MOUSEK=2                 ! F rechte Maustaste
  2065.         LET dw!=TRUE              ! Dauerwiederholvorgabe einschalten
  2066.       ENDIF                       ! d
  2067.       ' ........................................................................
  2068.       PUT g_x%(g_n%),g_y%(g_n%),g_cs$,9 ! Cusor ein
  2069.       ' ........................................................................
  2070.       KEYLOOK k%                ! gedrückte Taste anschauen
  2071.       IF MOUSEK=1 OR k%=65563 OR k%=268501019 ! F linke Maustaste; oft Abbruchm.
  2072.         PUT g_x%(g_n%),g_y%(g_n%),g_cs$,9 ! Cusor aus
  2073.         LET dw!=FALSE             ! Dauerwiederholungsvorgabe=Falsch
  2074.         EXIT IF -1                ! raus
  2075.       ENDIF                       ! d
  2076.       ' ........................................................................
  2077.       LET g_proctest$="abspielen" ! Name der aufrufenden Prozedur fürDebugging
  2078.       ' ........................................................................
  2079.       IF MOUSEK=1                 ! F linke Maustaste; oft Abbruchm.
  2080.         PUT g_x%(g_n%),g_y%(g_n%),g_cs$,9 ! Cusor aus
  2081.         LET dw!=FALSE             ! Dauerwiederholungsvorgabe=Falsch
  2082.         EXIT IF -1                ! raus
  2083.       ENDIF                       ! d
  2084.       ' ........................................................................
  2085.       LET f!=FALSE                ! Fehlerflag erst mal 0 (dh. alles ok!)
  2086.       @a_tonausgabe(f!)           ! d
  2087.       IF f!                       ! f Fehlerflag gesetzt
  2088.         PUT g_x%(g_n%),g_y%(g_n%),g_cs$,9 ! Cusor aus
  2089.         LET dw!=FALSE             ! Dauerwiederholungsvorgabe=Falsch
  2090.         EXIT IF -1                ! raus
  2091.       ENDIF                       ! d
  2092.       ' ........................................................................
  2093.       IF MOUSEK=1                 ! F linke Maustaste; oft Abbruchm.
  2094.         PUT g_x%(g_n%),g_y%(g_n%),g_cs$,9 ! Cusor aus
  2095.         LET dw!=FALSE             ! Dauerwiederholungsvorgabe=Falsch
  2096.         EXIT IF -1                ! raus
  2097.       ENDIF                       ! d
  2098.       ' ........................................................................
  2099.       PAUSE g_vz|/2^VAL(MID$(g_n$(g_n%),2,1))! Pause Abspielgeschw./2^Fähnchenzahl
  2100.       ' ........................................................................
  2101.       IF MOUSEK=1                 ! F linke Maustaste; oft Abbruchm.
  2102.         PUT g_x%(g_n%),g_y%(g_n%),g_cs$,9 ! Cusor aus
  2103.         LET dw!=FALSE             ! Dauerwiederholungsvorgabe=Falsch
  2104.         EXIT IF -1                ! raus
  2105.       ENDIF                       ! d
  2106.       ' ........................................................................
  2107.       PUT g_x%(g_n%),g_y%(g_n%),g_cs$,9 ! Cusor aus
  2108.       ' ........................................................................
  2109.     NEXT g_n%                     ! nächste zu spielende Note
  2110.     ' ..........................................................................
  2111.   UNTIL dw!=FALSE                 ! wiederhole bis abgebrochen
  2112.   WAVE 0,0                        ! Ton aus
  2113.   ' ............................................................................
  2114.   LET g_n%=mg_n%                  ! Cursorposition wiederherstellen
  2115.   PUT g_x%(g_n%),g_y%(g_n%),g_cs$,9 ! Cusor ein
  2116.   ' ----------------------------------------------------------------------------
  2117. RETURN
  2118. > PROCEDURE 3_soundwahl           !_:
  2119.   ' ----------------------------------------------------------------------------
  2120.   ' (*): Wenn die letzte Note im Stück eine 1/32- Note ist, wird
  2121.   ' ............................................................................
  2122.   LOCAL al|                             ! Tonhöhe der letzten Note
  2123.   LOCAL av|                             ! Tonhöhe der vorletzten Note
  2124.   LOCAL b|                              ! Periodendauer
  2125.   LOCAL s1%                             ! Soundparameter
  2126.   LOCAL s2%                             ! Soundparameter
  2127.   LOCAL s3%                             ! Soundparameter
  2128.   ' ............................................................................
  2129.   LET b|=VAL(MID$(g_n$(g_mn%),2,1))     ! Periode der letzten Note
  2130.   IF b|=3 AND g_midi!=TRUE AND g_mn%>3  ! F letzte Note 1/32 und Midi ein:
  2131.     LET s1%=ASC(LEFT$(g_n$(g_mn%-1),1))-65! Tonhöhe der vorletzen Note
  2132.     LET s2%=ASC(LEFT$(g_n$(g_mn%),1))-65! Tonhöhe der letzten Note
  2133.     '    PRINT AT(1,1);"'";s1%;"'","'";s2%;"'     "
  2134.     OUT 3,192,s1%                       ! Sound einschalten Kanal 1
  2135.     OUT 3,193,s2%                       ! Sound einschalten Kanal 2
  2136.   ENDIF                                 ! d
  2137.   OUT 3,194,g_k3|                       ! immer Percussion-Sound auf  Kanal 3
  2138.   ' ............................................................................
  2139.   ' (*): Die Vorletzte Note bildet die 1. Ziffer des Soundparameters, die
  2140.   '      letzte Note (genauer: die Tonhöhe der letzten Note) die 2. Ziffer.
  2141.   ' ----------------------------------------------------------------------------
  2142. RETURN
  2143. > PROCEDURE 1_faehnchen           !_:
  2144.   ' ----------------------------------------------------------------------------
  2145.   ' Der aktuellen Note wird ein Fähnchen hinzugefügt. Ist die Fähnchenobergrenze
  2146.   ' bereits erreicht, fängt's wieder bei null Fähnchen an.
  2147.   ' ----------------------------------------------------------------------------
  2148.   LOCAL a|                              ! Tonhöhe
  2149.   LOCAL b|                              ! Periodendauer
  2150.   LOCAL c|                              ! gebunden?
  2151.   LOCAL d|                              ! betont?
  2152.   ' ............................................................................
  2153.   IF g_bla%<>0 OR g_ble%<>0             ! F Blockmarken existieren:
  2154.     GOTO raus_faehnchen                 ! Raus
  2155.   ENDIF                                 ! d
  2156.   IF g_n%>g_mn%                         ! F Endschreibmodus:
  2157.     GOTO raus_faehnchen                 ! Raus
  2158.   ENDIF                                 ! d
  2159.   IF ASC(LEFT$(g_n$(g_n%),1))-64<0      ! F kaputte Tonhöhe
  2160.     GOTO raus_takt_setzen               ! Raus
  2161.   ENDIF                                 ! d
  2162.   ' ............................................................................
  2163.   LET a|=ASC(LEFT$(g_n$(g_n%),1))-64    ! letzte Note d.vorherigen Zle: Tonhöhe
  2164.   LET b|=VAL(MID$(g_n$(g_n%),2,1))      ! letzte Note d.vorherigen Zle: Periode
  2165.   LET c|=VAL(MID$(g_n$(g_n%),3,1))      ! letzte Note d.vorherigen Zle: gebund.?
  2166.   LET d|=VAL(RIGHT$(g_n$(g_n%),1))      ! letzte Note d.vorherigen Zle: betont?
  2167.   ' ............................................................................
  2168.   IF b|=3                               ! F maximale Fähnchenanzahl:
  2169.     LET b|=0                            ! Fähnchenanzahl null
  2170.   ELSE                                  ! < maximale Fähnchenanzahl:
  2171.     INC b|                              ! ein Fähnchen dazu
  2172.   ENDIF                                 ! d
  2173.   MID$(g_n$(g_n%),2,1)=STR$(b|)         ! Änderung abspeichern
  2174.   PUT g_x%(g_n%),g_y%(g_n%),g_cs$,9     ! Cusor aus
  2175.   PUT g_x%(g_n%),g_y%(g_n%),g_lz$       ! Leerzeichen an Cursorposition ausgeben
  2176.   PUT g_x%(g_n%),g_y%(g_n%),g_nb$(a|,b|,c|,d|),7      ! Note auf Bildschirm
  2177.   PUT g_x%(g_n%),g_y%(g_n%),g_cs$,9     ! Cusor ein
  2178.   ' ............................................................................
  2179.   raus_faehnchen:                       ! d
  2180.   ' ----------------------------------------------------------------------------
  2181. RETURN
  2182. ' ------------------------------------------------------------------------------
  2183. > PROCEDURE a_tonausgabe(f!)      !_:
  2184.   ' ----------------------------------------------------------------------------
  2185.   ' Aufrufende Prozeduren: 'endeschr', 'insert', 'neu_cpos', 'abspielen'
  2186.   ' ----------------------------------------------------------------------------
  2187.   ' f!                                  ! Fehlerflag
  2188.   LOCAL m|                              ! Wahldummy für Alertbox
  2189.   LOCAL a|                              ! Tonhöhe
  2190.   LOCAL b|                              ! Periodendauer
  2191.   LOCAL c|                              ! - 2 Oktaven?
  2192.   LOCAL d|                              ! Taktstrich ?
  2193.   LOCAL m$                              ! Menütextvariable
  2194.   ' ............................................................................
  2195.   IF ASC(LEFT$(g_n$(g_n%),1))-64<0      ! F Katastrophe (Stück kaputt!!)
  2196.     LET m$="Achtung! Fehler|in 'a_tonausgabe'|bei Notennr:'"
  2197.     LET m$=m$+STR$(g_n%)+"'|Stück '"+g_fn$+"'ist futsch! /raus!"
  2198.     @a_alert(m$,m|)                     ! d
  2199.     LET f!=TRUE                         ! Fehlerflag setzen
  2200.     GOTO raus_tonausgabe                ! unverrichteter Dinge raus
  2201.   ENDIF                                 ! d
  2202.   ' ............................................................................
  2203.   LET a|=ASC(LEFT$(g_n$(g_n%),1))-64    ! Tonhöhe
  2204.   LET b|=VAL(MID$(g_n$(g_n%),2,1))      ! Periode
  2205.   LET c|=VAL(MID$(g_n$(g_n%),3,1))      ! - 2 Oktaven?
  2206.   LET d|=VAL(RIGHT$(g_n$(g_n%),1))      ! betont, also mit Taktstrich?
  2207.   ' ............................................................................
  2208.   IF g_n%>1                             ! F Notennr. > 1
  2209.     WAVE 0,0                            ! Ton aus
  2210.     PAUSE 1                             ! Kurze Pause
  2211.   ENDIF                                 ! d
  2212.   ' ............................................................................
  2213.   @a2_s(g_ls|+d|*2,a|,c|,b|)            ! entgültige Tonausgabe
  2214.   ' PAUSE g_vz|/2^b|                    ! Pause Abspielgeschw./2^Fähnchenzahl
  2215.   raus_tonausgabe:                      ! d
  2216.   ' ----------------------------------------------------------------------------
  2217. RETURN
  2218. > PROCEDURE a2_s(ls|,th|,ok|,zt|) !_:
  2219.   ' ----------------------------------------------------------------------------
  2220.   ' ls|                                 ! Lautstärke
  2221.   ' th|                                 ! Tonhöhe
  2222.   ' ok|                                 ! - 2 Oktaven?
  2223.   ' zt|                                 ! Zeit (Dauer der Note)
  2224.   LOCAL oktave|                         ! Oktavenvariable
  2225.   ' ............................................................................
  2226.   IF th|=26                             ! F Pause
  2227.     IF NOT g_midi!                      ! F kein Midi-Keyboard angeschlossen:
  2228.       WAVE 0,0                          ! Ton aus
  2229.     ELSE                                ! F Midi-Keyboard angeschlossen
  2230.       OUT 3,128,g_mt1|,1                ! alten Ton aus Kanal 1
  2231.       OUT 3,128,g_mt1|-24,1             ! alten Taktstrichton aus Kanal 1
  2232.       OUT 3,129,g_mt2|,1                ! alten Ton aus Kanal 2
  2233.       OUT 3,130,g_perc|                 ! alten Ton aus Kanal 3
  2234.       IF ls|>g_ls|                      ! F Taktstrich
  2235.         OUT 3,146,g_perc|,1             ! neuen Ton an  Kanal 3
  2236.       ENDIF                             ! d
  2237.     ENDIF                               ! d
  2238.   ELSE                                  ! keine Pause
  2239.     IF NOT g_midi!                        ! F kein Midi-Keyboard angeschlossen:
  2240.       ' Folgender Befehl ist für Vierteltonmusik gedacht:siehe auch '1_tonhoehe'
  2241.       ' Hier klappt's nur mit 2 Oktaven, also nicht jetzt, da 4 Oktaven erlaubt.
  2242.       ' SOUND 1,ls|,#(ROUND(125000/fr%(th|+vt|*25))),zt| ! endgültige Tonausgabe
  2243.       SOUND 1,ls|,th|,g_okt|-2*ok|,zt|    ! jetzige Tonausgabe
  2244.     ELSE                                  ! F Midi-Keyboard angeschlossen
  2245.       OUT 3,128,g_mt1|,1                  ! alten Ton aus Kanal 1
  2246.       OUT 3,129,g_mt2|,1                  ! alten Ton aus Kanal 2
  2247.       OUT 3,130,g_perc|                   ! alten Ton aus Kanal 3
  2248.       '
  2249.       LET oktave|=59-24*ok|               ! F Minuszweioktavenflag gesetzt:
  2250.       '                                   ! eben 2 Oktaven abziehen
  2251.       LET g_mt1|=oktave|+th|              ! Ton merken
  2252.       OUT 3,144,g_mt1|,1                  ! neuen Ton an  Kanal 1
  2253.       LET g_mt2|=oktave|+th|              ! Ton merken
  2254.       IF ok|=0                            ! F nicht minus 2 Oktaven
  2255.         LET g_mt2|=g_mt2|-24              ! 2 Oktaven abziehen
  2256.       ENDIF                               ! d
  2257.       OUT 3,145,g_mt2|,1                  ! neuen Ton an  Kanal 2
  2258.       IF ls|>g_ls|                        ! F Taktstrich
  2259.         OUT 3,146,g_perc|,1               ! neuen Ton an  Kanal 3
  2260.       ENDIF                               ! d
  2261.     ENDIF                                 ! d
  2262.   ENDIF                                 ! EFU Pause / keine Pause
  2263.   ' ----------------------------------------------------------------------------
  2264. RETURN
  2265. > PROCEDURE a_undostueck          !_:
  2266.   ' ----------------------------------------------------------------------------
  2267.   ' Hier wird das aktuelle Stück in den Undo-Array kopiert
  2268.   ' ............................................................................
  2269.   LOCAL i%                      ! Notenzähler
  2270.   ' ............................................................................
  2271.   LET gu_mn%=g_mn%              ! Stücklänge speichern
  2272.   FOR i%=1 TO g_mn%             ! ganzes Stück durch
  2273.     LET gu_n$(i%)=g_n$(i%)      ! Note kopieren
  2274.   NEXT i%                       ! nächste Note
  2275.   ' ----------------------------------------------------------------------------
  2276. RETURN
  2277. > PROCEDURE a_fehler_abfangen     !_:
  2278.   ' ----------------------------------------------------------------------------
  2279.   ' Im Falle daß ein Fehler im Programmablauf auftaucht, wird wegen des aller-
  2280.   ' ersten Befehls des Programms 'on error gosub a_fehler_abfangen' hierher-
  2281.   ' gesprungen. So kann dann der Text erst einmal gerettet werden:
  2282.   ' ----------------------------------------------------------------------------
  2283.   @a_alert("Fehler im Programm!/Abspeichern!",a|)
  2284.   @2_stueck_abspeichern         ! Text schnell noch mal abspeichern
  2285.   PRINT CHR$(7);                ! klingeln
  2286.   PRINT AT(1,1);ERR$(ERR);" Fatal=";FATAL
  2287.   PRINT AT(3,3);"letzte notierte Prozedur: '";g_proctest$;"'"
  2288.   STOP                          ! d
  2289.   ' ----------------------------------------------------------------------------
  2290. RETURN
  2291. ' ##############################################################################
  2292. '  S t ü c k b e a r b e i t u n g :
  2293. ' ##############################################################################
  2294. > PROCEDURE 0_hauptmenue          !_:
  2295.   ' ----------------------------------------------------------------------------
  2296.   LOCAL i|                              ! Zähler für Menüeinträge
  2297.   LOCAL m|                              ! Maustastenmerker
  2298.   LOCAL a|                              ! Nr. des gewählten Menüeintrags
  2299.   DIM h$(10)                            ! Hauptmenüeintragsliste
  2300.   DIM d!(10)                            ! Dummyarray
  2301.   ' ............................................................................
  2302.   IF NOT g_midi!                        ! F kein Midi-Keyboard angeschlossen:
  2303.     WAVE 0,0                            ! Ton aus
  2304.   ELSE                                  ! F Midi-Keyboard angeschlossen
  2305.     OUT 3,128,g_mt1|,1                  ! alten Ton aus Kanal 1
  2306.     OUT 3,128,g_mt1|-24,1               ! alten Taktstrichton aus Kanal 1
  2307.     OUT 3,129,g_mt2|,1                  ! alten Ton aus Kanal 2
  2308.     OUT 3,130,g_perc|,1                 ! alten Ton aus Kanal 3
  2309.   ENDIF                                 ! d
  2310.   ' ............................................................................
  2311.   RESTORE hauptmenue                    ! Readzeiger auf Position
  2312.   REPEAT                                ! Leseschleife
  2313.     INC i|                              ! Eintragszähler erhöhen
  2314.     READ h$(i|)                         ! Hauptmenüeintrag lesen
  2315.   UNTIL h$(i|)="##"                     ! Raus f nix eingelesen
  2316.   DEC i|                                ! Anzahl der Hauptmenüeinträge
  2317.   ' ............................................................................
  2318.   nochmal_hauptmenue:                   ! d
  2319.   PRINT AT(1,1);SPACE$(80);             ! 1. Zeile ganz weiß (sieht besser aus)
  2320.   PUT 56*8,0,g_prgname$                 ! Programmnamen abbilden
  2321.   @a_menue(-1,0,-1,0,0,0,1,0,i|,1,m|,a|,h$(),d!())
  2322.   IF a|=0                               ! F Abbruch:
  2323.     GOTO raus_hauptmenue                ! d
  2324.   ENDIF                                 ! d
  2325.   @1_um(a|,m|)                          ! Untermenü ausfahren
  2326.   IF a|<>i| OR m|=2                     ! F nicht letzten Eintrag gewählt:
  2327.     GOTO nochmal_hauptmenue             ! d
  2328.   ENDIF                                 ! d
  2329.   ' ............................................................................
  2330.   raus_hauptmenue:                      ! d
  2331.   ERASE h$(),d!()                       ! Arrays löschen
  2332.   PUT 0,0,g_kl$                         ! Klaviatur wiederherstellen
  2333.   ' ----------------------------------------------------------------------------
  2334. RETURN
  2335. > PROCEDURE 1_um(w|,VAR m|)       !_:
  2336.   ' ----------------------------------------------------------------------------
  2337.   ' w|                                  ! Nr des gewählten Eintrags im Hauptmenü
  2338.   ' m|                                  ! Maustaste
  2339.   LOCAL i|                              ! Zähler für Menüeinträge
  2340.   LOCAL q|                              ! Nr. des gewählten Menüeintrags
  2341.   LOCAL b$                              ! Bildschirmspeichervariable
  2342.   DIM m$(11)                            ! Menüeintragsliste
  2343.   DIM k!(11)                            ! Dummyarray
  2344.   ' ............................................................................
  2345.   SELECT w|                             ! Betrachte Nr. des gewählten Eintrags
  2346.   CASE 1                                ! Eintrag Nr. 1:
  2347.     RESTORE stueckmenue                 ! Read-Zeiger setzen
  2348.   CASE 2                                ! Eintrag Nr. 2:
  2349.     RESTORE hauptfile                   ! Read-Zeiger setzen
  2350.   CASE 3                                ! Eintrag Nr. 3:
  2351.     RESTORE blockmenue                  ! Read-Zeiger setzen
  2352.   CASE 4                                ! Eintrag Nr. 4:
  2353.     RESTORE parameter                   ! Read-Zeiger setzen
  2354.   CASE 5                                ! Eintrag Nr. 5:
  2355.     RESTORE menue_exit                  ! Read-Zeiger setzen
  2356.   ENDSELECT                             ! Ende der Verzweigung
  2357.   ' ............................................................................
  2358.   REPEAT                                ! Leseschleife
  2359.     INC i|                              ! Eintragszähler erhöhen
  2360.     READ m$(i|)                         ! Hauptmenüeintrag lesen
  2361.   UNTIL m$(i|)="##"                     ! Raus f nix eingelesen
  2362.   DEC i|                                ! Anzahl der Untermenüeinträge
  2363.   ' ............................................................................
  2364.   IF w|=4                               ! F Parameter-Rubrik gewählt
  2365.     IF g_midi!                          ! F Midi eingeschaltet
  2366.       LET m$(3)="Midi ausschalten"      ! d
  2367.     ELSE                                ! F Midi ausgeschaltet
  2368.       LET m$(3)="Midi einschalten"      ! d
  2369.     ENDIF                               ! d
  2370.   ENDIF                                 ! d
  2371.   ' ............................................................................
  2372.   SGET b$                               ! Bildschirm retten
  2373.   @a_menue(-1,0,-1,0,0,-1,2+(w|-1)*11,1,1,i|,m|,q|,m$(),d!())
  2374.   SPUT b$                               ! Bildschirm wiederherstellen
  2375.   ' ............................................................................
  2376.   IF m|=2                               ! F Abbruch gewählt:
  2377.     GOTO raus_untermenue                ! d
  2378.   ENDIF                                 ! d
  2379.   @2_analyse(w|,q|)                     ! d
  2380.   raus_untermenue:                      ! d
  2381.   ERASE m$(),k!()                       ! Arrays löschen
  2382.   ' ----------------------------------------------------------------------------
  2383. RETURN
  2384. > PROCEDURE 2_analyse(w|,q|)      !_:
  2385.   ' ----------------------------------------------------------------------------
  2386.   ' w|                                  ! Nr des gewählten Eintrags im Hauptmenü
  2387.   ' q|                                  ! Nr des gewählten Eintrags im Untermenü
  2388.   ' ............................................................................
  2389.   IF w|=1 AND q|=1                      ! d
  2390.     ' Stück auf Disk speichern
  2391.     @2_stueck_abspeichern
  2392.   ELSE IF w|=1 AND q|=2                 ! d
  2393.     ' Stück von Disk laden
  2394.     @2_stueck_laden
  2395.   ELSE IF w|=1 AND q|=4                 ! d
  2396.     ' Stück in Hauptfile speichern
  2397.     @1_abspeichern
  2398.   ELSE IF w|=1 AND q|=5                 ! d
  2399.     ' Stück von Hauptfile laden
  2400.     @1_laden
  2401.   ELSE IF w|=1 AND q|=7                 ! d
  2402.     ' bestimmte Stücke drucken
  2403.     @2_drucken_gewaehlte
  2404.   ELSE IF w|=1 AND q|=8                 ! d
  2405.     ' bestimmte Stücke spielen
  2406.     @2_spielen_gewaehlte
  2407.   ELSE IF w|=2 AND q|=1                 ! d
  2408.     ' Hauptfile neuanlegen
  2409.     @2_hauptfileneuanlegen
  2410.   ELSE IF w|=2 AND q|=2                 ! d
  2411.     ' Hauptfile laden
  2412.     @2_hauptfile_laden
  2413.   ELSE IF w|=2 AND q|=3                 ! d
  2414.     ' Hauptfile abspeichern
  2415.     @2_save_hauptfile
  2416.   ELSE IF w|=2 AND q|=5                 ! d
  2417.     ' beliebiges File löschen
  2418.     @2_file_loeschen
  2419.   ELSE IF w|=2 AND q|=6                 ! d
  2420.     ' File umbenennen
  2421.     @2_rename_file
  2422.   ELSE IF w|=2 AND q|=8                 ! d
  2423.     ' Inhaltsverzeichnis drucken
  2424.     @2_inhverz_drucken
  2425.   ELSE IF w|=2 AND q|=9                 ! d
  2426.     ' Alle Stücke drucken
  2427.     @2_drucken_ab_x_alle
  2428.   ELSE IF w|=2 AND q|=10                ! d
  2429.     ' Alle Stücke spielen
  2430.     @2_spielen_ab_x_alle
  2431.   ELSE IF w|=3 AND q|=1                 ! d
  2432.     ' Anfang
  2433.     @1_blockmark(1)
  2434.   ELSE IF w|=3 AND q|=2                 ! d
  2435.     ' Ende
  2436.     @1_blockmark(2)
  2437.   ELSE IF w|=3 AND q|=3                 ! d
  2438.     ' Marken löschen
  2439.     @1_blockmark(3)
  2440.   ELSE IF w|=3 AND q|=5                 ! d
  2441.     ' kopieren
  2442.     @1_block_kopieren
  2443.   ELSE IF w|=3 AND q|=6                 ! d
  2444.     ' doppelt so schnell
  2445.     @3_bl_faehnchen(0)
  2446.   ELSE IF w|=3 AND q|=7                 ! d
  2447.     ' halb so schnell
  2448.     @3_bl_faehnchen(-1)
  2449.   ELSE IF w|=3 AND q|=8                 ! d
  2450.     ' transponieren
  2451.     @3_bl_transponieren
  2452.   ELSE IF w|=3 AND q|=10                ! d
  2453.     ' löschen
  2454.     @1_block_loeschen
  2455.   ELSE IF w|=4 AND q|=1                 ! d
  2456.     ' Abspielgeschwindigkeit
  2457.     @1_abspielgeschw
  2458.   ELSE IF w|=4 AND q|=2                 ! d
  2459.     ' Pause zw. den Stücken
  2460.     @1_stueckpause
  2461.   ELSE IF w|=4 AND q|=3                 ! d
  2462.     ' Midi ein/aus
  2463.     @1_midi_ein_aus
  2464.   ELSE IF w|=5 AND q|=1                 ! d
  2465.     ' Eingabe fortsetzen
  2466.   ELSE IF w|=5 AND q|=3                 ! d
  2467.     @1_programmende(1)
  2468.   ELSE IF w|=5 AND q|=5                 ! d
  2469.     @1_programmende(2)
  2470.   ENDIF                                 ! d
  2471.   ' ----------------------------------------------------------------------------
  2472. RETURN
  2473. ' ------------------------------------------------------------------------------
  2474. > PROCEDURE 2_stueck_abspeichern  !_:
  2475.   ' ----------------------------------------------------------------------------
  2476.   LOCAL ok!                     ! flag für Diskplatz~
  2477.   LOCAL i|                      ! Notenzähler
  2478.   LOCAL j|                      ! Übergabezähler
  2479.   LOCAL a|                      ! Tonhöhe
  2480.   LOCAL b|                      ! Periodendauer
  2481.   LOCAL c|                      ! - 2 Oktaven?
  2482.   LOCAL e|                      ! + x Oktaven
  2483.   LOCAL tz|                     ! Taktnotenzähler ('Music-Writer':<=16 Noten/T.)
  2484.   LOCAL a$                      ! Speicher für Übergabearrayeintrag, Kanal 1
  2485.   LOCAL b$                      ! Speicher für Übergabearrayeintrag, Kanal 2
  2486.   LOCAL c$                      ! Speicher für Übergabearrayeintrag, Kanal 3
  2487.   LOCAL m$                      ! Stückname
  2488.   LOCAL kl$                     ! Klaviaturnegativ
  2489.   DIM t$(13)                    ! Notenbuchstabenarray
  2490.   DIM n$(g_os%)                 ! Übergabearray
  2491.   ' ............................................................................
  2492.   GET 0,0,g_bb%-1,g_mh|-1,kl$   ! Klaviatur mit Hauptmenütext fotogr.
  2493.   PUT 0,0,g_kl$                 ! Klaviatur ohne Hauptmenütext raus
  2494.   PRINT AT(1,1);"Gewählt: aktuelles Stück auf Disk speichern: alter Name: '";
  2495.   PRINT g_fn$;"'"               ! bisherigen Stücknamen angeben
  2496.   ' ............................................................................
  2497.   @3_dfrei(802,ok!)             ! sind noch 130404 Bytes auf Disk frei?
  2498.   IF NOT ok!                    ! F nicht:
  2499.     GOTO raus_stueck_abspeichern ! d
  2500.   ENDIF                         ! d
  2501.   ' ............................................................................
  2502.   FILESELECT "A:\*.NTA",m$,m$   ! Fileselectbox
  2503.   ' ............................................................................
  2504.   IF m$="" OR g_mn%=0           ! F Abbruch gewählt oder keine Note vorhanden
  2505.     GOTO raus_stueck_abspeichern ! d
  2506.   ELSE IF LEN(m$)>4             ! F Name mehr als 4 Buchstaben lang:
  2507.     LET g_fn$=LEFT$(m$,LEN(m$)-4) ! '.EXT' wegschneiden
  2508.   ENDIF                         ! d
  2509.   ' ............................................................................
  2510.   RESTORE tonleiter             ! Lesezeiger setzen
  2511.   FOR i|=1 TO 13                ! Alle Töne durch plus Pause
  2512.     READ t$(i|)                 ! Tonbuchstaben ('C'-'H','PP') einlesen
  2513.   NEXT i|                       ! nächster Ton
  2514.   LET g_n$(g_mn%+1)="Z101"      ! Pause mit Taktstrich am Schluß
  2515.   FOR i|=1 TO g_mn%+1           ! Alle Noten des aktuellen Stücks durch
  2516.     LET a|=ASC(LEFT$(g_n$(i|),1))-64 ! Tonhöhe
  2517.     LET b|=VAL(MID$(g_n$(i|),2,1))   ! Periode, codiert wie in 'Notedita':
  2518.     '                                ! 0=1/4,1=1/8,2=1/16,3=1/32,Noteditacodiert
  2519.     LET c|=VAL(MID$(g_n$(i|),3,1))   ! - 2 Oktaven?
  2520.     LET e|=0                    ! erst mal Basisoktave (4)
  2521.     IF a|>12 AND a|<25          ! F obere Oktave
  2522.       LET e|=1                  ! merken, daß obere Oktave
  2523.       LET a|=a|-12              ! zurechtstutzen für Tonbuchstabenarray
  2524.     ELSE IF a|=25               ! F höchstes C
  2525.       LET e|=2                  ! Oktave merken
  2526.       LET a|=1                  ! Tonbuchstabencode
  2527.     ELSE IF a|=26               ! F Pause
  2528.       LET a|=13                 ! 13.Stelle als Buchstabe: t$(13)="PP"
  2529.     ENDIF                       ! d
  2530.     LET a$=a$+t$(a|)            ! Tonbuchstaben in Übergabestring
  2531.     IF a|<>13                   ! F keine Pause
  2532.       LET a$=a$+STR$(4-c|*2+e|) ! Oktavennummer (Tonumfang: C2-C6)
  2533.     ENDIF                       ! d
  2534.     LET a$=a$+STR$(5-b|)        ! Periode, normcodiert:
  2535.     '                           ! 5=1/4, 4=1/8, 3=1/16, 2=1/32, normcodiert
  2536.     LET b$=b$+"PP"+STR$(5-b|)   ! Pausenstring für Kanal 2
  2537.     LET c$=c$+"PP"+STR$(5-b|)   ! Pausenstring für Kanal 3
  2538.     INC tz|                     ! Taktzähler ('Music-Writer':<=16 Noten/Takt) +1
  2539.     IF tz|>15                   ! F 16. Note ohne Taktstrich:
  2540.       MID$(g_n$(i|+1),4,1)="1"  ! Taktstrich bei nächster Note setzen
  2541.     ENDIF                       ! d
  2542.     IF VAL(RIGHT$(g_n$(i|+1),1)) ! nächste Note mit Taktstrich?
  2543.       LET n$(j|)=a$+"|"         ! Übergabe für Kanal 1
  2544.       INC j|                    ! Zähler für Übergabearray erhöhen
  2545.       LET n$(j|)=b$+"|"         ! Übergabe für Kanal 2
  2546.       INC j|                    ! Zähler für Übergabearray erhöhen
  2547.       LET n$(j|)=c$+"|"         ! Übergabe für Kanal 3
  2548.       INC j|                    ! Zähler für Übergabearray erhöhen
  2549.       CLR a$,b$,c$,tz|          ! Speicher für Übergabearrayeinträge löschen
  2550.       '                         ! und auch Taktnotenzähler löschen
  2551.     ENDIF                       ! d
  2552.   NEXT i|                       ! nächste Note
  2553.   ' ............................................................................
  2554.   OPEN "O",#1,m$                ! File öffnen
  2555.   FOR i|=0 TO j|                ! Alle normcodierten Zeilen durch
  2556.     PRINT #1,n$(i|)             ! Zeile raus
  2557.     EXIT IF n$(i|)=""           ! raus f Leerzeile
  2558.   NEXT i|                       ! Nächste Zeile
  2559.   CLOSE #1                      ! File schließen
  2560.   ' ............................................................................
  2561.   raus_stueck_abspeichern:      ! d
  2562.   PUT 0,0,kl$                   ! Klaviatur mit Hauptmenütext raus
  2563.   ERASE n$()                    ! Übergabearray zerstören
  2564.   ERASE t$()                    ! Notenbuchstabenarray löschen
  2565.   ' ----------------------------------------------------------------------------
  2566. RETURN
  2567. > PROCEDURE 2_stueck_laden        !_:
  2568.   ' ----------------------------------------------------------------------------
  2569.   LOCAL i|                      ! Notenpositionszähler
  2570.   LOCAL m%                      ! Anzahl der zu untersuchenden normcod.Textzln.
  2571.   LOCAL m$                      ! Stückname
  2572.   LOCAL kl$                     ! Klaviaturnegativ
  2573.   DIM n$(g_os%*3)               ! Zwischenspeicherarray dimensionieren
  2574.   ' ............................................................................
  2575.   GET 0,0,g_bb%-1,g_mh|-1,kl$   ! Klaviatur mit Hauptmenütext fotogr.
  2576.   PUT 0,0,g_kl$                 ! Klaviatur ohne Hauptmenütext raus
  2577.   PRINT AT(1,1);"Gewählt: Einzelnes Stück von Disk laden: Aktuelles Stück geht verloren !!"
  2578.   ' ............................................................................
  2579.   FILESELECT "A:\*.NTA",m$,m$   ! Fileselectbox
  2580.   ' ............................................................................
  2581.   IF m$="" OR NOT EXIST(m$)     ! F Abbruch gewählt:
  2582.     GOTO raus_stueck_laden      ! d
  2583.   ELSE IF LEN(m$)>4             ! F Name mehr als 4 Buchstaben lang:
  2584.     LET g_fn$=LEFT$(m$,LEN(m$)-4) ! '.EXT' wegschneiden
  2585.   ENDIF                         ! d
  2586.   @a_undostueck                 ! Stück vorsichtshalber in Undoarray kopieren
  2587.   ' ............................................................................
  2588.   OPEN "I",#1,m$                ! File öffnen
  2589.   LET i%=-1                     ! bei Null starten
  2590.   WHILE NOT EOF(#1)             ! F noch nicht End of file erreicht:
  2591.     INC i%                      ! Zeilenzähler für normcodierten Array erhöhen
  2592.     EXIT IF i%>g_os%*3          ! Raus f Dimensionierungsrahmen gesprengt würde
  2593.     LINE INPUT #1,n$(i%)        ! Zeile einlesen
  2594.     '    RECALL #1,n$(),-1,dummy% ! Array in den Zwischenspeicherarray laden
  2595.   WEND                          ! ende
  2596.   CLOSE #1                      ! File schließen
  2597.   LET i%=0                      ! bei Null starten
  2598.   WHILE n$(i%)<>""              ! Schleife zum Auffinden des Arrayendes
  2599.     DELETE n$(i%+1)             ! i|+1-ten Eintrag löschen (2.Stimme)
  2600.     DELETE n$(i%+1)             ! i|+1-ten Eintrag löschen (3.Stimme)
  2601.     INC i%                      ! Positionszähler erhöhen
  2602.   WEND                          ! Ende erreicht
  2603.   LET m%=i%-1                   ! Endtaktnummer errechnen
  2604.   ' ............................................................................
  2605.   @3_rueckc(m%,n$())            ! Rückcodieren
  2606.   IF m%=-1                      ! Katastrophe geschehen:
  2607.     GOTO raus_stueck_laden      ! d
  2608.   ENDIF                         ! d
  2609.   ' ............................................................................
  2610.   SPUT g_lb$                            ! Bild von Infotext und Noten reinigen
  2611.   IF g_mn%>0                            ! F überhaupt was da
  2612.     @2_stueck_ganz_zeigen               ! Geladenes Stück auf Bildschirm
  2613.     IF g_mn%=g_os%                      ! F 200 Noten
  2614.       LET g_n%=g_mn%                    ! Cursor auf letze Note
  2615.     ELSE                                ! d
  2616.       LET g_n%=g_mn%+1                  ! Notencursor auf Stückende: erst hier,
  2617.       '                                 ! da in 'geladenes_stueck' for-Schleife
  2618.     ENDIF                               ! d
  2619.   ELSE                                  ! d
  2620.     LET g_n%=1                          ! Endschreibmodus
  2621.   ENDIF                                 ! d
  2622.   LET g_bla%=0                          ! Blockanfang löschen
  2623.   LET g_ble%=0                          ! Blockende löschen
  2624.   PUT g_x%(g_n%),g_y%(g_n%),g_cs$,9     ! Cusor ein
  2625.   ' ............................................................................
  2626.   raus_stueck_laden:            ! d
  2627.   PUT 0,0,kl$                   ! Klaviatur mit Hauptmenütext raus
  2628.   ERASE n$()                    ! Zwischenspeicherarray löschen
  2629.   ' ----------------------------------------------------------------------------
  2630. RETURN
  2631. > PROCEDURE 3_rueckc(VAR m%,n$()) !_:
  2632.   ' ----------------------------------------------------------------------------
  2633.   ' m%                          ! Anzahl der normcodierten Textzeilen, am Ende
  2634.   '                             ! jedoch Abbruchflag
  2635.   ' n$(g_os%*3)                 ! Zwischenspeicherarray für normcodierten Text
  2636.   LOCAL a|                      ! Menüwahlvariable für Alertbox
  2637.   LOCAL i|                      ! Taktzähler für normcodierten Text
  2638.   LOCAL j|                      ! Zeichenzähler für normcodierte Textzeile
  2639.   LOCAL ml|                     ! Nummer der 1.Note im Takt merken
  2640.   LOCAL k|                      ! Notencode (1-13), 13=Pause, Rest Notenbuchst.
  2641.   LOCAL l|                      ! Notenzähler für 'Notedita'-cod. Notenarray
  2642.   LOCAL o|                      ! Oktavennummer
  2643.   LOCAL min_2_okt|              ! Minuszweioktavenflag
  2644.   LOCAL obere_okt|              ! untere Oktave (Flag)
  2645.   LOCAL p|                      ! Periodencode
  2646.   LOCAL a$                      ! Notenbuchstabe oder Kreuz
  2647.   LOCAL b$                      ! evtl. (falls a$="#") Notenbuchstabe
  2648.   LOCAL l$                      ! einzulesender Notenbuchstabe
  2649.   LOCAL p$                      ! Periodenzeichen
  2650.   LOCAL m$                      ! Menütext
  2651.   ' ............................................................................
  2652.   FOR i|=0 TO m%                ! Alle Takte durch
  2653.     FOR j|=1 TO LEN(n$(i|))-1   ! Alle Zeichen im i|-ten Takt durch (bis auf
  2654.       '                         ! Taktstrichzeichen am Ende
  2655.       IF j|=1                   ! F noch am Taktanfang:
  2656.         LET ml|=l|+1            ! Nummer der 1.Note im Takt merken
  2657.       ENDIF                     ! d
  2658.       LET a$=MID$(n$(i|),j|,1)  ! j|-tes Zeichen im i|-ten Takt festhalten
  2659.       INC j|                    ! Zeichenzähler erhöhen
  2660.       LET b$=MID$(n$(i|),j|,1)  ! j|-tes Zeichen im i|-ten Takt festhalten
  2661.       IF a$="b"                 ! F unerlaubterweise 'b' statt '#':
  2662.         @4_btokreuz(a$,b$)      ! aus 'b' '#' machen und b$ entsprechen ändern
  2663.       ENDIF                     !
  2664.       RESTORE tonleiter         ! Lesezeiger setzen
  2665.       CLR k|                    ! Notencodezähler null setzen
  2666.       REPEAT                    ! Leseschleife
  2667.         READ l$                 ! Notenbuchstaben einlesen (evtl Kreuz davor)
  2668.         INC k|                  ! Notencode erhöhen
  2669.         IF k|>13                ! Falsches Zeichen
  2670.           LET m$="Codierfehler!|Falsches Zeichen|Taktnr:'"+STR$(i|)+"'"
  2671.           LET m$=m$+"/Abbruch"  ! Menütext
  2672.           @a_alert(m$,a|)       ! Alertbox
  2673.           ' PRINT g_n$(l|),l|,"Weiter? a$=";a$;" b$=";b$;" l$=";l$;" n$(";i|;")=";n$(i|) !  Martin Mittelmaier
  2674.           EXIT IF a|            ! R f a|
  2675.         ENDIF                   ! d
  2676.       UNTIL l$=a$ OR l$=a$+b$   ! raus f Note gefunden
  2677.       EXIT IF a|                ! R f a|
  2678.       IF l$=a$                  ! f nicht beide Zeichen,sondern nur 1 verbraucht
  2679.         DEC j|                  ! Zeichenzähler erniedrigen
  2680.       ENDIF                     ! d
  2681.       IF (l$=a$ OR l$=a$+b$) AND (NOT l$="PP")   ! f analysiertes Zeichen eine Note |  Ufnaustr.3 1000 Berlin 21
  2682.         INC j|                  ! Zeichenzähler erhöhen
  2683.         LET o|=VAL(MID$(n$(i|),j|,1)) ! j|-tes Zeichen im i|-ten Takt festh.
  2684.         SELECT o|               ! Oktavennummer wird jetzt untersucht:
  2685.         CASE 2                  ! F 2. Oktave
  2686.           LET min_2_okt|=1      ! Minuszweioktavenflag setzen
  2687.           LET obere_okt|=0      ! untere Oktave
  2688.         CASE 3                  ! F 3. Oktave
  2689.           LET min_2_okt|=1      ! Minuszweioktavenflag setzen
  2690.           LET obere_okt|=1      ! Obere Oktave
  2691.         CASE 4                  ! F 4. Oktave
  2692.           LET min_2_okt|=0      ! Minuszweioktavenflag löschen
  2693.           LET obere_okt|=0      ! untere Oktave
  2694.         CASE 5                  ! F 5. Oktave
  2695.           LET min_2_okt|=0      ! Minuszweioktavenflag löschen
  2696.           LET obere_okt|=1      ! Obere Oktave
  2697.         CASE 6                  ! F 6. Oktave, d.h. das höchste c
  2698.           LET min_2_okt|=0      ! Minuszweioktavenflag löschen
  2699.           LET obere_okt|=2      ! oberobere Oktave
  2700.         ENDSELECT               ! d
  2701.         INC l|                  ! Notenzähler erhöhen
  2702.         LET g_n$(l|)=CHR$(64+k|+obere_okt|*12)   ! Code überg.
  2703.       ELSE IF l$="PP"           ! F Pause:
  2704.         INC l|                  ! Notenzähler erhöhen
  2705.         LET g_n$(l|)=CHR$(64+26)! Pausencode übergeben
  2706.       ELSE                      ! sonst: Unglück
  2707.         LET m$="Codierfehler!|Keine Note gefunden!|Taktnr:'"+STR$(i|)+"'"
  2708.         LET m$=m$+"/Abbruch!"! Menütext
  2709.         @a_alert(m$,a|)         ! Alertbox
  2710.         EXIT IF a|              ! R f a|
  2711.       ENDIF                     ! d
  2712.       EXIT IF a|                ! R f a|
  2713.       INC j|                    ! Zeichenzähler erhöhen
  2714.       LET p$=MID$(n$(i|),j|,1)  ! j|-tes Zeichen im i|-ten Takt festhalten
  2715.       '                         ! 0=1/4,1=1/8,2=1/16,3=1/32,Noteditacodiert
  2716.       '                         ! 5=1/4, 4=1/8, 3=1/16, 2=1/32, normcodiert
  2717.       LET p|=VAL(p$)            ! Periodencodierung festhalten
  2718.       IF p|=5 OR p|=4 OR p|=3 OR p|=2 ! F 'Notedita'-mögliche Periodenwerte:
  2719.         LET p$=STR$(5-p|)       ! Codieren wie in 'Notedita'
  2720.       ELSE                      ! kein 'Notedita'-möglicher Wert:
  2721.         LET m$="Codierfehler!|Periode falsch!|Taktnr:'"+STR$(i|)+"'"
  2722.         LET m$=m$+"/8-tel Note!"! Menütext
  2723.         @a_alert(m$,a|)         ! Alertbox
  2724.         LET a|=0                ! Rausflag löschen, denn:
  2725.         LET p$="1"              ! setze einfach 1/8-tel
  2726.       ENDIF                     ! d
  2727.       EXIT IF a|                ! R f a|
  2728.       LET g_n$(l|)=g_n$(l|)+p$  ! Periodencode nach Notenstringarray übergeben
  2729.       LET g_n$(l|)=g_n$(l|)+STR$(min_2_okt|) ! Minuszweioktavenflag übergeben
  2730.       LET g_n$(l|)=g_n$(l|)+"0" ! Erst mal keinen Taktstrich übergeben
  2731.       '      PRINT g_n$(l|),l|,"Weiter? a$=";a$;" b$=";b$;" l$=";l$;" n$(";i|;")=";n$(i|)
  2732.     NEXT j|                     ! nächstes Zeichen im i|-ten Takt
  2733.     IF i|>0                     ! F schön höher als erster Takt
  2734.       MID$(g_n$(ml|),4,1)="1"   ! erste Note hat Taktstrich
  2735.     ENDIF                       ! d
  2736.     IF l|+1>g_os%               ! f obere Schranke für Notenanz.überschr.w.würde
  2737.       LET m$="Codierfehler!|Zuviele Noten!|Taktnr:'"+STR$(i|)+"'"
  2738.       LET m$=m$+"/Abbruch"      ! Menütext
  2739.       @a_alert(m$,a|)           ! Alertbox
  2740.       LET a|=0                  ! d
  2741.       LET i|=m%                 ! für Abbruch ohne Zerstörung sorgen
  2742.     ENDIF                       ! d
  2743.     EXIT IF a|                  ! R f a|
  2744.   NEXT i|                       ! nächster Takt; Maximum: m%
  2745.   IF a|                         ! F Rausflag gesetzt:
  2746.     LET m%=-1                   ! Übergaberausflag setzen
  2747.   ENDIF                         ! d
  2748.   LET g_mn%=l|                  ! maximale Notennr übergeben
  2749.   ' ----------------------------------------------------------------------------
  2750. RETURN
  2751. > PROCEDURE 4_btokreuz(VAR y$,z$) !_:
  2752.   ' ----------------------------------------------------------------------------
  2753.   ' y$                          ! hier steht 'b' statt '#'
  2754.   ' z$                          ! hier steht die zu erniedrigende Note ('C'-'H')
  2755.   LET y$="#"                    ! d
  2756.   IF z$="C"                     ! d
  2757.     LET z$="H"                  ! d
  2758.   ELSE IF z$="D"                ! d
  2759.     LET z$="C"                  ! d
  2760.   ELSE IF z$="E"                ! d
  2761.     LET z$="D"                  ! d
  2762.   ELSE IF z$="F"                ! d
  2763.     LET z$="E"                  ! d
  2764.   ELSE IF z$="G"                ! d
  2765.     LET z$="F"                  ! d
  2766.   ELSE IF z$="A"                ! d
  2767.     LET z$="G"                  ! d
  2768.   ELSE IF z$="H"                ! d
  2769.     LET z$="A"                  ! d
  2770.   ENDIF                         ! d
  2771.   ' ----------------------------------------------------------------------------
  2772. RETURN
  2773. > PROCEDURE 1_abspeichern         !_:
  2774.   ' ----------------------------------------------------------------------------
  2775.   ' Ein Notentext wird gespeichert.
  2776.   ' ----------------------------------------------------------------------------
  2777.   LOCAL z!                              ! Flag für Halbtoncheck
  2778.   LOCAL stuecknr|                       ! d
  2779.   LOCAL a|                              ! Wahlknopf für Alertbox
  2780.   LOCAL m|                              ! Maustastenvar. für Menü
  2781.   LOCAL s%                              ! Zähler für schwarze Tasten
  2782.   LOCAL w%                              ! Zähler für weiße Tasten
  2783.   LOCAL n%                              ! zähler für Notenposition
  2784.   LOCAL a$                              ! Zwischenspeicher für Notencode
  2785.   LOCAL s$                              ! Abkürzungsvariable
  2786.   LOCAL kl$                             ! Klaviaturnegativ
  2787.   ' ............................................................................
  2788.   ' 0.)  H a l b t o n c h e c k :
  2789.   ' ............................................................................
  2790.   GET 0,0,g_bb%-1,g_mh|-1,kl$   ! Klaviatur mit Hauptmenütext fotogr.
  2791.   PUT 0,0,g_kl$                 ! Klaviatur ohne Hauptmenütext raus
  2792.   PRINT AT(1,1);" Gewählt: Abspeichern            " ! Infotext/'Löschen'löschen
  2793.   ' ............................................................................
  2794.   @2_shwtch(s%,w%,z!)                   ! Mehr schwarze als weiße Tasten ?
  2795.   IF z!                                 ! f mehr schwarze als weiße Tasten:
  2796.     @a_alert("Mehr schwarze '"+STR$(s%)+"'|als weiße Tasten! '"+STR$(w%)+"'/Ok!|Abbruch!",a|)
  2797.     IF a|=2                             ! f Abbruch gewählt
  2798.       GOTO raus_abspeichern             ! uverrichteter Dinge raus
  2799.     ENDIF                               ! d
  2800.   ENDIF                                 ! d
  2801.   ' ............................................................................
  2802.   @2_speichermenu(stuecknr|)            ! großes Menü ausfahren: StÜcknr wählen
  2803.   IF stuecknr|=0                        ! F Abbruch gewählt
  2804.     GOTO raus_abspeichern               ! uverrichteter Dinge raus
  2805.   ENDIF                                 ! d
  2806.   ' ............................................................................
  2807.   WHILE NOT EXIST(g_hf$)                ! Solange Notenhauptdatei nicht auf Disk
  2808.     @a_alert("Diskette mit| Hauptfile|einlegen!/Ok!|Abbruch!",a|)
  2809.     IF a|=2                             ! f Abbruch gewählt
  2810.       GOTO raus_abspeichern             ! uverrichteter Dinge raus
  2811.     ENDIF                               ! d
  2812.   WEND                                  ! d6
  2813.   ' ............................................................................
  2814.   LET g_fn$=MID$(g_stueck$(0),(stuecknr|-1)*8+1,8) ! Stückname ermitteln
  2815.   PRINT AT(50,1);"Stückname:'";g_fn$;"'"! Infotext
  2816.   IF g_fn$="________"                   ! Code für Löschen
  2817.     @2_stueck_loeschen(stuecknr|)       ! d
  2818.     GOTO raus_abspeichern               ! raus
  2819.   ENDIF                                 ! d
  2820.   ' ............................................................................
  2821.   g_stueck$(stuecknr|+1)=STRING$(800,"@") ! Speicherstring auffüllen +1, weil in
  2822.   '                                     ! g_stueck$(1) die Datumsliste drin ist.
  2823.   FOR n%=1 TO g_mn%                     ! Alle Notenpositionen durch
  2824.     MID$(g_stueck$(stuecknr|+1),(n%-1)*4+1,4)=g_n$(n%) ! Notencode übergeben
  2825.   NEXT n%                               ! nächste Notenposition
  2826.   ' ............................................................................
  2827.   OPEN "U",#1,g_hf$                     ! Datei öffnen 'U'=Update, ja nich 'O'!!
  2828.   PRINT #1,g_stueck$(0)                 ! Namenliste abspeichern
  2829.   PRINT #1,g_stueck$(1)                 ! Datumliste abspeichern
  2830.   SEEK #1,1281+1282+(stuecknr|-1)*802+1 ! Datenzeiger positionieren:
  2831.   '                                     ! Für 'SEEK' gilt: 0.Position bis
  2832.   '                                     ! 160*8-1=1279.Pos. sind Namen, dann
  2833.   '                                     ! 1280: LF, und 1281: CR, dann:
  2834.   '                                     ! 1282 bis 1281+160*8=2561 sind Datum,
  2835.   '                                     ! 2562: LF, und 2563(=1281+1282): CR,
  2836.   '                                     ! Wegen LF+CR am Ende jedes Strings im
  2837.   '                                     ! Folgenden 802 statt 200*4=800 !
  2838.   PRINT #1,g_stueck$(stuecknr|+1)       ! Akt. Notenstück abspeichern,+1, da in
  2839.   '                                     ! g_stueck$(1) die Datumsliste drin ist.
  2840.   CLOSE #1                              ! Datei schließen
  2841.   ' ............................................................................
  2842.   @1_fileselectboxfoto                  ! Fileselectbox fotografieren
  2843.   ' ............................................................................
  2844.   raus_abspeichern:                     ! Rauslabel
  2845.   PUT 0,0,g_kl$                         ! Klaviatur von Infotext reinigen
  2846.   ' ----------------------------------------------------------------------------
  2847. RETURN
  2848. > PROCEDURE 2_shwtch(VAR s%,w%,z!)!_:
  2849.   ' ----------------------------------------------------------------------------
  2850.   ' Hier wird gecheckt, wieviele der Noten im aktuellen Stück schwarzen und
  2851.   ' wieviele weißen entsprechen.
  2852.   ' ----------------------------------------------------------------------------
  2853.   ' z!                          ! Flag: mehr schwarze als weiße Tasten ? (ja=-1)
  2854.   ' s%                          ! Zähler für schwarze Tasten
  2855.   ' w%                          ! Zähler für weiße Tasten
  2856.   LOCAL a|                      ! Tonhöhe
  2857.   LOCAL i%                      ! Zähler für Noten im aktuellen Stück
  2858.   ' ............................................................................
  2859.   FOR i%=1 TO g_mn%             ! Alle Noten durch
  2860.     LET a|=ASC(LEFT$(g_n$(i%),1))-64 ! Tonhöhe (1-25)
  2861.     SELECT a|                   ! Betrachte die Tonhöhe
  2862.     CASE 2,4,7,9,11,14,16,19,21,23 ! f schwarze Taste:
  2863.       INC s%                    ! Zähler für schwarze Taste erhöhen
  2864.     DEFAULT                     ! Ansonsten ist's ja 'ne weiße Taste:
  2865.       INC w%                    ! Zähler für weiße Taste erhöhen
  2866.     ENDSELECT                   ! Ende
  2867.   NEXT i%                       ! nächste Note
  2868.   IF s%>w%                      ! F mehr schwarze als weiße Tasten:
  2869.     LET z!=TRUE                 ! d
  2870.   ENDIF                         ! d
  2871.   ' ----------------------------------------------------------------------------
  2872. RETURN
  2873. > PROCEDURE 2_speichermenu(VAR w|)!_:
  2874.   ' ----------------------------------------------------------------------------
  2875.   ' w|                                          ! Wahlvariable
  2876.   LOCAL mw|                                     ! Wahlvariablenmerker
  2877.   LOCAL m|                                      ! Maustastenvar. für Menü
  2878.   LOCAL i|                                      ! Zähler
  2879.   LOCAL b$                                      ! Zwischenspeicherstring
  2880.   LOCAL d$                                      ! Datum
  2881.   LOCAL i$                                      ! Infotext
  2882.   LOCAL c$                                      ! Bildschirmspeichervariable
  2883.   ' ............................................................................
  2884.   DIM a$(g_stka|)                               ! Menüeintragsfelderarray dim.
  2885.   DIM b$(g_stka|)                               ! Menüeintragsfelderarray dim.
  2886.   DIM a%(g_stka|)                               ! Nummerierungsarray dim.
  2887.   ' ............................................................................
  2888.   SGET c$                                       ! Bildschirm retten
  2889.   ' ............................................................................
  2890.   SPUT g_fsb$                                   ! Fileselectbox raus
  2891.   PUT 0,0,g_kl$                                 ! Klaviatur ohne Hauptmenütext
  2892.   LET i$=" Gewählt: Abspeichern / Löschen  "    ! Infotext
  2893.   LET i$=i$+" B i s h e r i g e r  Name:'"      ! Infotext
  2894.   LET i$=i$+g_fn$                               ! Infotext
  2895.   FOR i|=1 TO g_stka|                           ! Alle Menüeinträge durch
  2896.     IF g_fn$=MID$(g_stueck$(0),(i|-1)*8+1,8) AND g_fn$<>"________" ! FNamen gef.
  2897.       LET i$=i$+"' Nr.:'"+STR$(i|)+"'"          ! physikalische Nummer merken
  2898.     ENDIF                                       ! d
  2899.   NEXT i|                                       ! nächster Menüeintrag
  2900.   PRINT AT(1,1);i$;                             ! Infotext anzeigen
  2901.   ' ............................................................................
  2902.   FOR i|=1 TO g_stka|                           ! Alle Menüeinträge durch
  2903.     LET a$(i|)=MID$(g_stueck$(0),(i|-1)*8+1,8)  ! Ins Menüeintragsfeld kopieren
  2904.     LET b$(i|)=a$(i|)                           ! physik. Array in b$() retten
  2905.     LET a%(i|)=i|                               ! Nummerierungsarrayeintrag
  2906.   NEXT i|                                       ! nächster Menüeintrag
  2907.   ' ............................................................................
  2908.   QSORT a$(),g_stka|+1,a%()                     ! Sortieren, a$() jetzt logisch
  2909.   ' ............................................................................
  2910.   '                                             ! 1.) Erst mal den Stücknamen:
  2911.   ' ............................................................................
  2912.   @a_menue(0,0,-1,0,-1,-1,4,4,8,20,m|,mw|,a$(),d!()) ! Menüprozedur aufrufen
  2913.   IF mw|=0 OR LEFT$(a$(mw|),2)="-1"             ! F nichts gewählt oder Abbruch:
  2914.     LET mw|=0                                   ! f Abbruch (b$(w|)="-1"):mw|=0
  2915.     GOTO raus_speichermenue                     ! raus
  2916.   ENDIF                                         ! d
  2917.   LET w|=a%(mw|)                                ! wirkliche,phys.Wahlnrermitteln
  2918.   LET b$(w|)=a$(mw|)                            ! Neuen Stücknamen an physik.
  2919.   '                                             ! Stringarray übergeben
  2920.   ' ............................................................................
  2921.   g_stueck$(0)=""                               ! Stücknamenteil leer machen
  2922.   FOR i|=1 TO g_stka|                           ! Alle Stücknamen durch
  2923.     LET g_stueck$(0)=g_stueck$(0)+b$(i|)        ! neuerEintrag inStücknamenliste
  2924.   NEXT i|                                       ! nächster Stückname
  2925.   ' ............................................................................
  2926.   '                                             ! 2.) Datum:
  2927.   ' ............................................................................
  2928.   '  PRINT AT(1,1);"'";MID$(g_stueck$(1),(w|-1)*8+1,8);"'   "
  2929.   IF MID$(g_stueck$(1),(w|-1)*8+1,8)="________" ! F bisher kein Datum:
  2930.     LET d$=LEFT$(DATE$,6)+RIGHT$(DATE$,2)       ! '19' von date$ rausschneiden
  2931.     MID$(g_stueck$(1),(w|-1)*8+1)=d$            ! Datum übergeben
  2932.   ENDIF                                         ! d
  2933.   ' ............................................................................
  2934.   '                                             ! Restarbeit:
  2935.   ' ............................................................................
  2936.   raus_speichermenue:                           ! Rauslabel
  2937.   SPUT c$                                       ! Bildschirm wieder herstellen
  2938.   ' ............................................................................
  2939.   ERASE a$()                                    ! Menüeintragsarray löschen
  2940.   ERASE b$()                                    ! Menüeintragsarray löschen
  2941.   ERASE a%()                                    ! Nummerierungsarray löschen
  2942.   ' ----------------------------------------------------------------------------
  2943. RETURN
  2944. > PROCEDURE 2_stueck_loeschen(s|) !_:
  2945.   ' ----------------------------------------------------------------------------
  2946.   ' s|                                  ! Stücknummer
  2947.   ' ............................................................................
  2948.   PRINT AT(1,1);" Gewählt: Löschen                " ! Infotext
  2949.   LET g_stueck$(s|)=STRING$(800,"@")    ! Stück mit Leerzeichen füllen
  2950.   ' ............................................................................
  2951.   OPEN "U",#1,g_hf$                     ! Datei öffnen 'U'=Update, ja nich 'O'!!
  2952.   PRINT #1,g_stueck$(0)                 ! Namenliste abspeichern
  2953.   '                                     ! Datenzeiger positionieren:
  2954.   SEEK #1,1281+(s|-1)*802+1             ! positionieren (Erkl. siehe 'laden')
  2955.   PRINT #1,g_stueck$(s|)                ! Aktuelles Notenstück abspeichern
  2956.   CLOSE #1                              ! Datei schließen
  2957.   ' ............................................................................
  2958.   @1_fileselectboxfoto                  ! Fileselectbox fotografieren
  2959.   ' ----------------------------------------------------------------------------
  2960. RETURN
  2961. > PROCEDURE 1_laden               !_:
  2962.   ' ----------------------------------------------------------------------------
  2963.   ' Ein Notentext wird geladen. Danach wird das Notenstück auf den Monitor ge-
  2964.   ' bracht.
  2965.   ' ----------------------------------------------------------------------------
  2966.   LOCAL stuecknr|                       ! d
  2967.   LOCAL dummy|                          ! Dummy für Alertbox
  2968.   LOCAL n%                              ! zähler für Notenposition
  2969.   LOCAL a$                              ! Zwischenspeicher für Notencode
  2970.   LOCAL s$                              ! Abkürzungsvariable
  2971.   ' ............................................................................
  2972.   @2_lademenue("Laden",stuecknr|)       ! großes Menü ausfahren: StÜcknr wählen
  2973.   IF stuecknr|=0                        ! F Abbruch gewählt
  2974.     GOTO raus_laden                     ! uverrichteter Dinge raus
  2975.   ENDIF                                 ! d
  2976.   @a_undostueck                         ! Stück vorsichtshalber in Undoarray
  2977.   ' ............................................................................
  2978.   LET g_fn$=MID$(g_stueck$(0),(stuecknr|-1)*8+1,8) ! Stückname ermitteln
  2979.   PRINT AT(50,1);"Neuer Stückname:'";g_fn$;"'"! Infotext
  2980.   ' ............................................................................
  2981.   LET s$=g_stueck$(stuecknr|+1)         ! Abkürzungsvariable füllen +1,weil in
  2982.   '                                     ! g_stueck$(1) die Datumsliste drin ist.
  2983.   FOR n%=1 TO g_os%                     ! Alle Notenpositionen durch
  2984.     LET a$=MID$(s$,(n%-1)*4+1,4)        ! Notencode (= 4 Zeichen) ermitteln
  2985.     EXIT IF a$="@@@@"                   ! Raus f Leernote
  2986.     LET g_n$(n%)=a$                     ! Notencode übergeben
  2987.   NEXT n%                               ! nächste Notenposition
  2988.   LET g_mn%=n%-1                        ! Endnotennr festlegen
  2989.   ' ............................................................................
  2990.   SPUT g_lb$                            ! Bild von Infotext und Noten reinigen
  2991.   IF g_mn%>0                            ! F überhaupt was da
  2992.     @2_stueck_ganz_zeigen               ! Geladenes Stück auf Bildschirm
  2993.     IF g_mn%=g_os%                      ! F 200 Noten
  2994.       LET g_n%=g_mn%                    ! Notencursor auf letzten Note
  2995.     ELSE                                ! d
  2996.       LET g_n%=g_mn%+1                  ! Notencursor auf Stückende: erst hier,
  2997.       '                                 ! da in 'geladenes_stueck' for-Schleife
  2998.     ENDIF                               ! d
  2999.   ELSE                                  ! d
  3000.     LET g_n%=1                          ! Endschreibmodus
  3001.   ENDIF                                 ! d
  3002.   LET g_bla%=0                          ! Blockanfang löschen
  3003.   LET g_ble%=0                          ! Blockende löschen
  3004.   PUT g_x%(g_n%),g_y%(g_n%),g_cs$,9     ! Cusor ein
  3005.   ' ............................................................................
  3006.   raus_laden:                           ! Rauslabel
  3007.   PUT 0,0,g_kl$                         ! Klaviatur von Infotext reinigen
  3008.   ' ----------------------------------------------------------------------------
  3009. RETURN
  3010. > PROCEDURE 2_lademenue(i$,VAR w|)!_:
  3011.   ' ----------------------------------------------------------------------------
  3012.   ' i$                                          ! Name der aufrufenden Prozedur
  3013.   ' w|                                          ! Wahlvariable
  3014.   LOCAL i|                                      ! Zählvariable
  3015.   LOCAL m|                                      ! Maustastenvar. für Menü
  3016.   LOCAL mw|                                     ! Merker für Wahlvariable
  3017.   LOCAL m$                                      ! Merker für Eintragsnamen
  3018.   LOCAL c$                                      ! Bildschirmspeichervariable
  3019.   DIM a$(g_stka|)                               ! Menüeintragsfelderarray dim.
  3020.   DIM a%(g_stka|)                               ! Nummerierungsarray dim.
  3021.   ' ............................................................................
  3022.   SGET c$                                       ! Bildschirm retten
  3023.   ' ............................................................................
  3024.   SPUT g_fsb$                                   ! Fileselectbox raus
  3025.   LET i$=" Gewählt: "+i$+" "                    ! Infotext
  3026.   LET i$=i$+" B i s h e r i g e r  Name:'"      ! Infotext
  3027.   LET i$=i$+g_fn$+"'      "                     ! Infotext
  3028.   PRINT AT(1,1);i$;                             ! Infotext anzeigen
  3029.   ' ............................................................................
  3030.   FOR i|=1 TO g_stka|                           ! Alle Menüeinträge durch
  3031.     LET a$(i|)=MID$(g_stueck$(0),(i|-1)*8+1,8)  ! Ins Menüeintragsfeld kopieren
  3032.     LET a%(i|)=i|                               ! Nummerierungsarrayeintrag
  3033.   NEXT i|                                       ! nächster Menüeintrag
  3034.   ' ............................................................................
  3035.   QSORT a$(),g_stka|+1,a%()                     ! Sortieren
  3036.   ' ............................................................................
  3037.   @a_menue(0,0,-1,0,0,-1,4,4,8,20,m|,w|,a$(),d!())! Menü aufrufen ohne Darstellung
  3038.   IF w|=0 OR a$(w|)="-"                         ! F nichts gewählt oder Abbruch:
  3039.     LET w|=0                                    ! f Abbruch (b$(w|)="-1"):mw|=0
  3040.     GOTO raus_lademenue                         ! raus
  3041.   ENDIF                                         ! d
  3042.   ' ............................................................................
  3043.   DO                                            ! Schleife für Datumsdarstellung
  3044.     ' ..........................................................................
  3045.     EXIT IF m|=1 OR w|=0                        ! Raus f linke Maustaste
  3046.     ' ..........................................................................
  3047.     IF mw|<>0                                   ! F schonmal Datum angeguckt:
  3048.       LET a$(mw|)=m$                            ! Letzten Namen wiederherstellen
  3049.     ENDIF                                       ! d
  3050.     ' ..........................................................................
  3051.     LET m$=a$(w|)                               ! Namen retten
  3052.     LET mw|=w|                                  ! Wahlnummer retten
  3053.     ' ..........................................................................
  3054.     LET a$(w|)=MID$(g_stueck$(1),(a%(w|)-1)*8+1,8)! Datum übergeben
  3055.     ' ..........................................................................
  3056.     @a_menue(-1,0,-1,0,0,-1,4,4,8,20,m|,w|,a$(),d!())! Menü mit Darstellung
  3057.     ' ..........................................................................
  3058.   LOOP                                          ! Schleifenende
  3059.   ' ............................................................................
  3060.   LET w|=a%(w|)                                 ! wirkliche Wahlnummer ermitteln
  3061.   ' ............................................................................
  3062.   raus_lademenue:                               ! Rauslabel
  3063.   SPUT c$                                       ! Bildschirm wieder herstellen
  3064.   ' ............................................................................
  3065.   ERASE a$()                                    ! Menüeintragsarray löschen
  3066.   ERASE a%()                                    ! Nummerierungsarray löschen
  3067.   ' ----------------------------------------------------------------------------
  3068. RETURN
  3069. > PROCEDURE 2_stueck_ganz_zeigen  !_:
  3070.   ' ----------------------------------------------------------------------------
  3071.   ' Das Notenstück im Speicherstring wird auf dem Monitor dargestellt.
  3072.   ' ----------------------------------------------------------------------------
  3073.   LOCAL b|                             ! Periodendauer
  3074.   LOCAL c|                             ! - 2 Oktaven?
  3075.   LOCAL d|                             ! Taktstrich?
  3076.   LOCAL m|                             ! Menüvar.
  3077.   LOCAL a%                             ! Tonhöhe
  3078.   LOCAL m$                             ! Menütextvar.
  3079.   ' ............................................................................
  3080.   FOR g_n%=1 TO g_mn%                  ! Alle Noten durch
  3081.     LET a%=ASC(LEFT$(g_n$(g_n%),1))-64 ! Tonhöhe
  3082.     IF a%<0                            ! F kaputte Tonhöhe
  3083.       LET m$="Achtung! Fehler|in '2_stueck_ganz_zeigen'|bei Notennr:'"
  3084.       LET m$=m$+STR$(g_n%)+"'|Stück '"+g_fn$+"' ist futsch! /raus!"
  3085.       @a_alert(m$,m|)                  ! d
  3086.       EXIT IF TRUE                     ! unverrichteter Dinge raus
  3087.     ENDIF                              ! d
  3088.     LET b|=VAL(MID$(g_n$(g_n%),2,1))   ! Periode
  3089.     LET c|=VAL(MID$(g_n$(g_n%),3,1))   ! - 2 Oktaven?
  3090.     LET d|=VAL(RIGHT$(g_n$(g_n%),1))   ! Taktstrich?
  3091.     PUT g_x%(g_n%),g_y%(g_n%),g_nb$(a%,b|,c|,d|),7      ! Note auf Bildschirm
  3092.     '                                  ! Schneller als die letzten 5 Zln wäre:
  3093.     '    PUT g_x%(g_n%),g_y%(g_n%),g_nb$(ASC(LEFT$(g_n$(g_n%),1))-64,VAL(MID$(g_n$(g_n%),2,1)),VAL(MID$(g_n$(g_n%),3,1)),VAL(RIGHT$(g_n$(g_n%),1))),7
  3094.   NEXT g_n%                            ! Nächste Note
  3095.   ' ----------------------------------------------------------------------------
  3096. RETURN
  3097. > PROCEDURE 2_drucken_gewaehlte   !_:
  3098.   ' ----------------------------------------------------------------------------
  3099.   ' Notentexte werden gedruckt; ausgewählte Stücke
  3100.   ' ----------------------------------------------------------------------------
  3101.   LOCAL r!                              ! Rausvariable 1
  3102.   LOCAL r|                              ! Rausvariable 2
  3103.   LOCAL i|                              ! Stückzähler
  3104.   LOCAL w|                              ! Wahlvariable fürs Menü
  3105.   LOCAL m_mn%                           ! Merker für letzte Note
  3106.   LOCAL m_n%                            ! Merker für Cursorposition
  3107.   LOCAL a$                              ! Zwischenspeicher für Notencode
  3108.   LOCAL s$                              ! Abkürzungsvariable
  3109.   LOCAL bld$                            ! Bildschirmrettungsnegativ
  3110.   LOCAL name$                           ! Stückname
  3111.   DIM w!(g_stka|)                       ! Auswahlarray, Eintrag=-1,f entspr.
  3112.   '                                     ! Stück ausgewählt worden ist.
  3113.   DIM w|(g_stka|)                       ! Alphabetnummerarray löschen
  3114.   DIM m_n$(g_os%)                       ! Zwischenspeicher für akt. Stück
  3115.   ' ............................................................................
  3116.   '     1.)  l e t z t e s  S t ü c k  r e t t e n :
  3117.   ' ............................................................................
  3118.   SGET bld$                             ! Bildschirm retten
  3119.   LET name$=g_fn$                       ! Namen retten
  3120.   LET m_mn%=g_mn%                       ! letzte Note des akt. Stücks merken
  3121.   LET m_n%=g_n%                         ! Cursorposition des akt. Stücks merken
  3122.   IF m_mn%<>0                           ! F vor Druckbefehl Stück im Speicher:
  3123.     FOR n%=1 TO g_mn%                   ! Alle Noten des akt. Stücks durch
  3124.       LET m_n$(n%)=g_n$(n%)             ! Stück in Speicherstring
  3125.     NEXT n%                             ! nächste Note des akt. Stücks
  3126.   ENDIF                                 ! d
  3127.   ' ............................................................................
  3128.   '     2.)  V o r b e r e i t u n g e n :
  3129.   ' ............................................................................
  3130.   PUT g_x%(g_n%),g_y%(g_n%),g_cs$,9     ! Cusor aus
  3131.   @3_dm("drucken",w|,w!(),w|())         ! großes Menü ausfahren: StÜcke wählen
  3132.   IF w|=0                               ! F Abbruch gewählt
  3133.     GOTO raus_drucken_gewaehlte         ! uverrichteter Dinge raus
  3134.   ENDIF                                 ! d
  3135.   FOR i|=1 TO g_stka|                   ! Alle Stücke durch (physikalisch)
  3136.     EXIT IF LEFT$(g_stueck$(i|+1),4)="@@@@" ! raus f leeres Stück
  3137.     IF w!(i|)=TRUE                      ! F Stück gedruckt werden soll:
  3138.       @3_dr_st(i|,w|(i|),r!)            ! Eine Ebene weiter runter zum Drucken
  3139.     ENDIF                               ! d
  3140.     IF r!=TRUE                          ! F abgebrochen:
  3141.       LET r!=FALSE                      ! d
  3142.       @a_alert("Ganz abbrechen?/Ja|Nein",r|) ! d
  3143.       EXIT IF r|=1                      ! Raus f ja gewählt:
  3144.     ENDIF                               ! d
  3145.     EXIT IF r|=1                        ! Raus f ja gewählt:
  3146.   NEXT i|                               ! nächstes Stück
  3147.   ' ............................................................................
  3148.   '     4.)  S t ü c k  w i e d e r h e r s t e l l e n :
  3149.   ' ............................................................................
  3150.   raus_drucken_gewaehlte:               ! Rauslabel
  3151.   IF m_mn%<>0                           ! F vor Druckbefehl Stück im Speicher:
  3152.     FOR n%=1 TO m_mn%                   ! Alle Noten des akt. Stücks durch
  3153.       LET g_n$(n%)=m_n$(n%)             ! Stück von Speicherstring in Arbeitsstr
  3154.     NEXT n%                             ! nächste Note des akt. Stücks
  3155.   ENDIF                                 ! d
  3156.   LET g_fn$=name$                       ! Stückname wiederherstellen
  3157.   LET g_n%=m_n%                         ! Cursor wo er früher war
  3158.   LET g_mn%=m_mn%                       ! vorher akt. Stück
  3159.   SPUT bld$                             ! Bildschirm wiederherstellen
  3160.   ERASE w!()                            ! Wahlarray löschen
  3161.   ERASE w|()                            ! Alphabetnummerarray löschen
  3162.   ERASE m_n$()                          ! Speicherarray löschen
  3163.   ' ----------------------------------------------------------------------------
  3164. RETURN
  3165. > PROCEDURE 3_dm(z$,VAR w|,w!(),w|())!_:
  3166.   ' ----------------------------------------------------------------------------
  3167.   ' z$                                          ! Name von aufrufender Prozedur
  3168.   ' w|                                          ! Wahlvar.=-1:was gewählt,0:nix
  3169.   ' w!()                                        ! Wahlarray
  3170.   ' w|()                                        ! Array für alphab. Stücknr.
  3171.   LOCAL i|                                      ! Zählvariable
  3172.   LOCAL m|                                      ! Maustastenvar. für Menü
  3173.   LOCAL c$                                      ! Bildschirmnegativ
  3174.   LOCAL i$                                      ! Infotext
  3175.   DIM a!(g_stka|)                               ! Eintragswahlfelderarray dim.
  3176.   DIM a$(g_stka|)                               ! Menüeintragsfelderarray dim.
  3177.   DIM a%(g_stka|)                               ! Nummerierungsarray dim.
  3178.   ' ............................................................................
  3179.   SGET c$                                       ! Bildschirm retten
  3180.   ' ............................................................................
  3181.   SPUT g_fsb$                                   ! Fileselectbox raus
  3182.   LET i$=" Gewählt: "+z$+" "                    ! Infotext
  3183.   PRINT AT(1,1);i$;                             ! Infotext anzeigen
  3184.   ' ............................................................................
  3185.   FOR i|=1 TO g_stka|                           ! Alle Menüeinträge durch
  3186.     LET a$(i|)=MID$(g_stueck$(0),(i|-1)*8+1,8)  ! Ins Menüeintragsfeld kopieren
  3187.     LET a%(i|)=i|                               ! Nummerierungsarrayeintrag
  3188.   NEXT i|                                       ! nächster Menüeintrag
  3189.   ' ............................................................................
  3190.   QSORT a$(),g_stka|+1,a%()                     ! Sortieren, alphabetisch, in
  3191.   '                                             ! a%() wird die physikalische
  3192.   '                                             ! Nr. mitsortiert.
  3193.   ' ............................................................................
  3194.   @a_menue(0,0,-1,-1,0,-1,4,4,8,20,m|,w|,a$(),a!())! Menü aufrufen ohne Darstellung
  3195.   IF w|=0                                       ! f nichts gewählt:
  3196.     GOTO raus_druck_menue                       ! d
  3197.   ENDIF                                         ! d
  3198.   ' ............................................................................
  3199.   FOR i|=1 TO g_stka|                           ! Alle Stücke durch, und zwar in
  3200.     '                                           ! alphabetischer Reihenfolge
  3201.     IF a!(i|)=TRUE                              ! F Stück gewählt:
  3202.       LET w!(a%(i|))=TRUE                       ! Wahlarray kennzeichnen und
  3203.       '                                         ! zwar an der physikalische Nr.
  3204.       LET w|(a%(i|))=i|                         ! Alphabetnr. merken
  3205.     ELSE                                        ! F Stück nicht gewählt:
  3206.       LET w!(a%(i|))=FALSE                      ! In Wahlarray übergeben
  3207.     ENDIF                                       ! d
  3208.   NEXT i|                                       ! nächstes Stück
  3209.   ' ............................................................................
  3210.   SPUT c$                                       ! Bildschirm wieder herstellen
  3211.   ' ............................................................................
  3212.   raus_druck_menue:                             ! d
  3213.   ERASE a!()                                    ! Menüwahlarray löschen
  3214.   ERASE a$()                                    ! Menüeintragsarray löschen
  3215.   ERASE a%()                                    ! Nummerierungsarray löschen
  3216.   ' ----------------------------------------------------------------------------
  3217. RETURN
  3218. > PROCEDURE 3_dr_st(i|,a|,VAR z!) !_:
  3219.   ' ----------------------------------------------------------------------------
  3220.   ' Hier wird ein einzelnes Stück angezeigt und evtl. gedruckt.
  3221.   ' ............................................................................
  3222.   ' i|                                  ! physikalische Stücknummer
  3223.   ' a|                                  ! alphabetische Stücknummer
  3224.   ' z!                                  ! Rausflag
  3225.   ' ............................................................................
  3226.   LOCAL lz|                             ! Nummer der letzten Zeile
  3227.   LOCAL m|                              ! Menüvariable
  3228.   LOCAL j|                              ! Ziffernzähler für Stücknummer
  3229.   LOCAL n%                              ! zähler für Notenposition
  3230.   LOCAL y%                              ! y-Startwert für Zeilenradiergummibox
  3231.   LOCAL a$                              ! alphab. Stücknr-/Notencodespeicher
  3232.   LOCAL p$                              ! phys. Stücknrspeicher
  3233.   LOCAL name$                           ! d
  3234.   LOCAL datu$                           ! Datum
  3235.   LOCAL stuecknummer$                   ! physikalische Stücknummer
  3236.   LOCAL menue$                          ! Alertboxtext
  3237.   ' ............................................................................
  3238.   '     1.)  B i l d - V o r b e r e i t u n g e n :
  3239.   ' ............................................................................
  3240.   SPUT g_lb$                            ! Löschbild
  3241.   DEFFILL 0                             ! Füllmuster weiß
  3242.   PBOX 0,0,g_bb%-1,g_mh|-2              ! Klaviatur wegradieren
  3243.   DEFFILL 1,2,8                         ! Füllmuster schwarz
  3244.   ' ............................................................................
  3245.   '     2.)  T i t e l z e i l e  f ü r  d a s  S t ü c k :
  3246.   ' ............................................................................
  3247.   CLS                                   ! Bildschirm ganz leer
  3248.   LET a$=STR$(i|)                       ! Stücknummer
  3249.   DEFTEXT 1,0,0,4                       ! kleine Schrift
  3250.   FOR j|=1 TO LEN(a$)                   ! alle Ziffern von i| durch
  3251.     TEXT 10,10+j|*6,MID$(a$,j|,1)       ! Ziffern untereinander schreiben
  3252.   NEXT j|                               ! nächste Ziffer
  3253.   GET 10,10,30,50,p$                    ! Nummer fotografieren
  3254.   LET a$=STR$(a|)                       ! alphabetische Stücknummer
  3255.   DEFTEXT 1,0,0,4                       ! kleine Schrift
  3256.   FOR j|=1 TO LEN(a$)                   ! alle Ziffern von a| durch
  3257.     TEXT 10,100+j|*6,MID$(a$,j|,1)      ! Ziffern untereinander schreiben
  3258.   NEXT j|                               ! nächste Ziffer
  3259.   GET 10,100,30,140,a$                  ! Nummer fotografieren
  3260.   CLS                                   ! Bildschirm ganz leer
  3261.   PUT g_x%(6)+10,g_y%(6)+28,p$          ! physikalische Stücknummer ausgeben
  3262.   PUT g_x%(86)+10,g_y%(86)+28,a$        ! alphabetische Stücknummer ausgeben
  3263.   ' ............................................................................
  3264.   '     3.)  g e w ä h l t e s  S t ü c k  r a u s f i l t e r n :
  3265.   ' ............................................................................
  3266.   LET s$=g_stueck$(i|+1)                ! Abkürzungsvariable füllen +1,weil in
  3267.   '                                     ! g_stueck$(1) die Datumsliste drin ist.
  3268.   FOR n%=1 TO g_os%                     ! Alle Notenpositionen durch
  3269.     LET a$=MID$(s$,(n%-1)*4+1,4)        ! Notencode (= 4 Zeichen) ermitteln
  3270.     EXIT IF a$="@@@@"                   ! Raus f Leernote
  3271.     LET g_n$(n%)=a$                     ! Notencode übergeben
  3272.   NEXT n%                               ! nächste Notenposition
  3273.   LET g_mn%=n%-1                        ! Endnotennr festlegen
  3274.   IF g_mn%=0                            ! F überhaupt nix da
  3275.     GOTO raus_drucke_st                 ! Rauslabel
  3276.   ENDIF                                 ! d
  3277.   ' ............................................................................
  3278.   '     4.)  E n d l i c h  D r u c k b i l d :
  3279.   ' ............................................................................
  3280.   LET g_fn$=MID$(g_stueck$(0),(i|-1)*8+1,8) ! Stückname ermitteln
  3281.   @4_druckbildhaelfte(1)                ! 1. Hälfte des Stücks auf Bildschirm
  3282.   LET menue$="'"+g_fn$+"' Wirklich drucken?/Ja|Nein" ! d
  3283.   @a_alert(menue$,m|)                   ! d
  3284.   IF m|=2                               ! Nein gewählt:
  3285.     LET z!=TRUE                         ! Rausvariable setzen
  3286.     GOTO raus_drucke_st                 ! raus
  3287.   ENDIF                                 ! d
  3288.   HIDEM                                 ! Mauspfeil weg
  3289.   '                                     ! Folgende Zeile bei PD-Version raus:
  3290.   LPRINT CHR$(27);CHR$(106);CHR$(100);  ! r e v e r s e s  the paper,page 140
  3291.   IF NOT GEMDOS(17)                     ! F Drucker nicht bereit:
  3292.     @a_alert("Drucker nicht bereit!/Aber jetzt!|raus!",m|) ! d
  3293.   ENDIF                                 ! d
  3294.   IF m|=2                               ! Nein gewählt:
  3295.     LET z!=TRUE                         ! Rausvariable setzen
  3296.     GOTO raus_drucke_st                 ! raus
  3297.   ENDIF                                 ! d
  3298.   HARDCOPY                              ! d
  3299.   CLS                                   ! Bildschirm löschen
  3300.   @4_druckbildhaelfte(2)                ! 2. Hälfte des Stücks auf Bildschirm
  3301.   HARDCOPY                              ! d
  3302.   CLS                                   ! Bildschirm löschen
  3303.   FOR i|=1 TO 8                         ! Vorschubschleife (*)
  3304.     LPRINT                              ! Zeilenvorschub
  3305.   NEXT i|                               ! nächster Zeilenvorschub
  3306.   '  LPRINT CHR$(27);CHR$(74);CHR$(5);     ! Korrekturvorschub n/216 inch
  3307.   ' ............................................................................
  3308.   raus_drucke_st:                       ! Rauslabel
  3309.   ' ----------------------------------------------------------------------------
  3310.   ' (*) Zwischen den beiden Stückhälften sind noch ein paar Zeilenvorschübe
  3311.   '     beim Drucken nötig, da zwischen den Notenzeilen sonst ja immer eine
  3312.   '     ganze Leerzeile ist, hier aber nur die obere Menüzeile, die etwas
  3313.   '     weniger hoch als eine Notenzeile ist.
  3314.   ' ----------------------------------------------------------------------------
  3315. RETURN
  3316. > PROCEDURE 4_druckbildhaelfte(h|)!_:
  3317.   ' ----------------------------------------------------------------------------
  3318.   LOCAL m|                              ! Menüvar.
  3319.   LOCAL a|                              ! Tonhöhe
  3320.   LOCAL b|                              ! Periodendauer
  3321.   LOCAL c|                              ! - 2 Oktaven?
  3322.   LOCAL d|                              ! Taktstrich?
  3323.   LOCAL rest|                           ! Notenzeilenhöhe - Menühühe
  3324.   LOCAL c%                              ! Cursorposition
  3325.   LOCAL s%                              ! Startnotennummer
  3326.   LOCAL e%                              ! Endnotennummer
  3327.   LOCAL n%                              ! Notennummer im zu druckenden Stückteil
  3328.   LOCAL b$                              ! Bildschirmspeicherstring
  3329.   LOCAL m$                              ! Menütextvar.
  3330.   ' ............................................................................
  3331.   LET c%=7                              ! Cursorposition am Anfang
  3332.   LET s%=1+(h|-1)*(3*34)                ! Startnotennummer festlegen
  3333.   IF g_mn%<s%                           ! Endnote des Stücks < Startnummer:
  3334.     GOTO raus_druckbildhaelfte          ! raus
  3335.   ENDIF                                 ! d
  3336.   IF h|=2                               ! f 2.Stückhälfte angezeigt werden soll:
  3337.     LET e%=g_mn%                        ! Endnotennummer festlegen
  3338.   ELSE                                  ! f 1.Stückhälfte angezeigt werden soll:
  3339.     IF g_mn%<3*34                       ! f Endnote d.Stücks < 3 Zln voll Noten:
  3340.       LET e%=g_mn%                      ! Endnotennummer festlegen
  3341.     ELSE                                ! f Endnote d.Stücks = 3 Zln voll Noten:
  3342.       LET e%=3*34                       ! Endnotennummer festlegen
  3343.     ENDIF                               ! d
  3344.   ENDIF                                 ! d
  3345.   ' ............................................................................
  3346.   LET b|=VAL(MID$(g_n$(g_mn%),2,1))     ! Periode der letzten Note
  3347.   IF b|=3 AND g_mn%>3 AND g_mn%-e%<3    ! F letzte Note 1/32 und > 3 Noten da:
  3348.     LET e%=e%-2                         ! Soundmarkierungen beim Absp. weglassen
  3349.   ENDIF                                 ! d
  3350.   FOR n%=s% TO e%                       ! Alle Noten des Stückteils durch
  3351.     ' ..........................................................................
  3352.     IF c%=7 OR c%=87 OR c%=167          ! f Cursor am Zeilenanfang:
  3353.       PUT g_x%(c%-1),g_y%(c%-1),g_ln$,7 ! Notenlinien für Notenschlüssel
  3354.       PUT g_x%(c%-2),g_y%(c%-2),g_ln$,7 ! Notenlinien für Notenschlüssel
  3355.       PUT g_x%(c%-2),g_y%(c%-2),g_ns$,7 ! Notenschlüssel projezieren
  3356.       PUT g_x%(c%-2)+3,g_y%(c%-2)+3,g_ns$,7 ! Schatten Notenschlüssel
  3357.     ENDIF                               ! d
  3358.     ' ..........................................................................
  3359.     PUT g_x%(c%),g_y%(c%),g_ln$         ! Notenlinien für abzubildende Note
  3360.     IF ASC(LEFT$(g_n$(n%),1))-64<0      ! F kaputte Tonhöhe
  3361.       LET m$="Achtung! Fehler|in '4_druckbildhaelfte'|bei Notennr:'"
  3362.       LET m$=m$+STR$(g_n%)+"'|Stück:'"+g_fn$+"'ist futsch! /raus!"
  3363.       @a_alert(m$,m|)                   ! d
  3364.       EXIT IF TRUE                      ! unverrichteter Dinge raus
  3365.     ENDIF                               ! d
  3366.     LET a|=ASC(LEFT$(g_n$(n%),1))-64    ! Tonhöhe
  3367.     LET b|=VAL(MID$(g_n$(n%),2,1))      ! Periode
  3368.     LET c|=VAL(MID$(g_n$(n%),3,1))      ! - 2 Oktaven?
  3369.     LET d|=VAL(RIGHT$(g_n$(n%),1))      ! Taktstrich ?
  3370.     PUT g_x%(c%),g_y%(c%),g_nb$(a|,b|,c|,d|),7   ! Note auf Bildschirm
  3371.     ' ..........................................................................
  3372.     INC c%                              ! Cursorposition erhöhen
  3373.     IF c%=41 OR c%=121                  ! f Cursor an Position 41 oder 121
  3374.       ADD c%,46                         ! eine Notenzeile überspringen
  3375.     ENDIF                               ! d
  3376.     ' ..........................................................................
  3377.   NEXT n%                               ! nächste Note des Stückteils
  3378.   ' ............................................................................
  3379.   GET 0,g_y%(1),g_bb%-1,g_bh%-1,b$      ! Bild fotografieren
  3380.   CLS                                   ! Bildschirm löschen
  3381.   IF h|=1                               ! f 1.Stückhälfte angezeigt werden soll:
  3382.     PUT 0,0,b$                          ! Bild wieder projezieren, aber jetzt
  3383.     '                                   ! ganz oben anfangen, um nix an Papier
  3384.     '                                   ! zu verschenken
  3385.   ELSE                                  ! f 2.Stückhälfte angezeigt werden soll:
  3386.     LET rest|=g_nzlh|-g_mh|             ! Notenzeilenhöhe - Menühühe,Erklärung:
  3387.     PUT 0,rest|,b$                      ! Bild wieder projezieren, aber jetzt
  3388.     '                                   ! etwas weiter unten, weil ja immer
  3389.     '                                   ! zwischen zwei gefüllten Notenzeilen
  3390.     '                                   ! genau eine Leerzeile der Höhe
  3391.     '                                   ! g_nzlh| sein soll.
  3392.   ENDIF                                 ! d
  3393.   ' ............................................................................
  3394.   raus_druckbildhaelfte:                ! Rauslabel
  3395.   ' ----------------------------------------------------------------------------
  3396. RETURN
  3397. > PROCEDURE 2_spielen_gewaehlte   !_:
  3398.   ' ----------------------------------------------------------------------------
  3399.   ' Notentexte werden gespielt; ausgewählte Stücke. Prozedurbau sehr ähnlich dem
  3400.   ' bei '2_drucken_gewaehlte'.
  3401.   ' ----------------------------------------------------------------------------
  3402.   LOCAL r!                              ! Rausvariable 1
  3403.   LOCAL r|                              ! Rausvariable 2
  3404.   LOCAL i|                              ! Stückzähler
  3405.   LOCAL w|                              ! Wahlvariable fürs Menü
  3406.   LOCAL m_mn%                           ! Merker für letzte Note
  3407.   LOCAL m_n%                            ! Merker für Cursorposition
  3408.   LOCAL a$                              ! Zwischenspeicher für Notencode
  3409.   LOCAL s$                              ! Abkürzungsvariable
  3410.   LOCAL bld$                            ! Bildschirmrettungsnegativ
  3411.   LOCAL name$                           ! Name des gespielten Stücks
  3412.   DIM w!(g_stka|)                       ! Auswahlarray, Eintrag=-1,f entspr.
  3413.   '                                     ! Stück ausgewählt worden ist.
  3414.   DIM w|(g_stka|)                       ! Alphabetnummerarray löschen
  3415.   DIM m_n$(g_os%)                       ! Zwischenspeicher für akt. Stück
  3416.   ' ............................................................................
  3417.   '     1.)  l e t z t e s  S t ü c k  r e t t e n :
  3418.   ' ............................................................................
  3419.   SGET bld$                             ! Bildschirm retten
  3420.   LET m_mn%=g_mn%                       ! letzte Note des akt. Stücks merken
  3421.   LET m_n%=g_n%                         ! Cursorposition des akt. Stücks merken
  3422.   LET name$=g_fn$                       ! Namen retten
  3423.   IF m_mn%<>0                           ! F vor Druckbefehl Stück im Speicher:
  3424.     FOR n%=1 TO g_mn%                   ! Alle Noten des akt. Stücks durch
  3425.       LET m_n$(n%)=g_n$(n%)             ! Stück in Speicherstring
  3426.     NEXT n%                             ! nächste Note des akt. Stücks
  3427.   ENDIF                                 ! d
  3428.   ' ............................................................................
  3429.   '     2.)  V o r b e r e i t u n g e n :
  3430.   ' ............................................................................
  3431.   PUT g_x%(g_n%),g_y%(g_n%),g_cs$,9     ! Cusor aus
  3432.   @3_dm("abspielen",w|,w!(),w|())       ! großes Menü ausfahren: StÜcke wählen
  3433.   IF w|=0                               ! F Abbruch gewählt
  3434.     GOTO raus_spielen_gewaehlte         ! uverrichteter Dinge raus
  3435.   ENDIF                                 ! d
  3436.   FOR i|=1 TO g_stka|                   ! Alle Stücke durch (physikalisch)
  3437.     EXIT IF LEFT$(g_stueck$(i|+1),4)="@@@@"       ! raus f leeres Stück
  3438.     IF w!(i|)=TRUE                                ! F Stück gespielt werden soll
  3439.       LET s$=g_stueck$(i|+1)                      ! Stück kopieren
  3440.       FOR j|=1 TO g_os%                           ! Alle Noten d.i|-ten St.durch
  3441.         LET g_n$(j|)=MID$(s$,(j|-1)*4+1,4)        ! ins aktuelle Stück kopieren
  3442.         EXIT IF g_n$(j|)="@@@@"                   ! F leere Note
  3443.       NEXT j|                                     ! nächste Note
  3444.       LET g_mn%=j|-1                              ! letzte Notennummer
  3445.       LET g_n%=g_mn%                              ! Cursor auf Stückende
  3446.       SPUT g_lb$                                  ! Bild v.Text, Noten reinigen
  3447.       @2_stueck_ganz_zeigen                       ! 'Geladenes' Stück auf Schirm
  3448.       LET g_fn$=MID$(g_stueck$(0),(i|-1)*8+1,8)   ! Stückname ermitteln
  3449.       PRINT AT(1,1);g_fn$;"  phys.Nr.:'";i|;"' "  ! Info
  3450.       PUT g_x%(g_n%),g_y%(g_n%),g_cs$,9           ! Cusor ein
  3451.       @2_abspielen(1,g_mn%)                       ! Stück spielen
  3452.       PAUSE g_sp%                                 ! Pause
  3453.       IF g_midi!                                  ! F Midi ein
  3454.         @3_stimme1                                ! Sound für Kanal 1 zufällig
  3455.         @3_stimme2                                ! Sound für Kanal 2 zufällig
  3456.       ENDIF                                       ! d
  3457.       IF ASC(INKEY$)=27                           ! Raus f Escape-Taste
  3458.         LET r!=TRUE                               ! Rausflag setzen
  3459.       ENDIF                                       ! d
  3460.       EXIT IF r!                                  ! Raus f Abgebrochen
  3461.     ENDIF                                         ! d
  3462.     IF r!=TRUE                          ! F abgebrochen:
  3463.       LET r!=FALSE                      ! d
  3464.       @a_alert("Ganz abbrechen?/Ja|Nein",r|) ! d
  3465.       EXIT IF r|=1                      ! Raus f ja gewählt:
  3466.     ENDIF                               ! d
  3467.     EXIT IF r|=1                        ! Raus f ja gewählt:
  3468.   NEXT i|                               ! nächstes Stück
  3469.   ' ............................................................................
  3470.   '     4.)  S t ü c k  w i e d e r h e r s t e l l e n :
  3471.   ' ............................................................................
  3472.   raus_spielen_gewaehlte:               ! Rauslabel
  3473.   IF m_mn%<>0                           ! F vor Druckbefehl Stück im Speicher:
  3474.     FOR n%=1 TO m_mn%                   ! Alle Noten des akt. Stücks durch
  3475.       LET g_n$(n%)=m_n$(n%)             ! Stück von Speicherstring in Arbeitsstr
  3476.     NEXT n%                             ! nächste Note des akt. Stücks
  3477.   ENDIF                                 ! d
  3478.   LET g_n%=m_n%                         ! Cursor wo er früher war
  3479.   LET g_mn%=m_mn%                       ! vorher akt. Stück
  3480.   LET g_fn$=name$                       ! Name des aktuellen Stücks wiederherst.
  3481.   SPUT bld$                             ! Bildschirm wiederherstellen
  3482.   ERASE w!()                            ! Wahlarray löschen
  3483.   ERASE w|()                            ! Alphabetnummerarray löschen
  3484.   ERASE m_n$()                          ! Speicherarray löschen
  3485.   ' ----------------------------------------------------------------------------
  3486. RETURN
  3487. ' ------------------------------------------------------------------------------
  3488. > PROCEDURE 2_hauptfileneuanlegen !_:
  3489.   ' ----------------------------------------------------------------------------
  3490.   LOCAL ok!                             ! Flag für Prüfprozedur
  3491.   LOCAL a|                              ! Wahlvariable für Alertbox
  3492.   LOCAL s%                              ! Zählvariable
  3493.   LOCAL schirm$                         ! Bildschirmspeichervariable
  3494.   LOCAL kl$                             ! Klaviaturnegativ
  3495.   ' ............................................................................
  3496.   GET 0,0,g_bb%-1,g_mh|-1,kl$           ! Klaviatur mit Hauptmenütext fotogr.
  3497.   PUT 0,0,g_kl$                         ! Klaviatur ohne Hauptmenütext raus
  3498.   PRINT AT(1,1);"Gewählt: Hauptfile neuanlegen (ca 40 s)";
  3499.   PRINT " bisher: '";g_hf$;"'"
  3500.   @3_dfrei(130404,ok!)                  ! sind noch 130404 Bytes auf Disk frei?
  3501.   IF NOT ok!                            ! F nicht:
  3502.     GOTO raus_hauptfileneuanlegen       ! d
  3503.   ENDIF                                 ! d
  3504.   @a_alert("Achtung! Alle Stücke |im RAM werden gelöscht!/ok!|raus!",a|)
  3505.   IF a|=2                               ! F 'raus!' gewählt
  3506.     GOTO raus_hauptfileneuanlegen       ! d
  3507.   ENDIF                                 ! d
  3508.   FILESELECT "A:\*.NTN",m$,m$           ! Fileselectbox
  3509.   IF m$=""                              ! F Abbruch gewählt:
  3510.     GOTO raus_hauptfileneuanlegen       ! d
  3511.   ELSE                                  ! sonst:
  3512.     LET g_hf$=RIGHT$(m$,LEN(m$)-3)      ! 'A:\' wegschneiden
  3513.   ENDIF                                 ! d
  3514.   PRINT AT(65,1);"'";g_hf$;"'"          ! Nochmal Anzeige des Namens
  3515.   ' ............................................................................
  3516.   LET g_stueck$(0)=STRING$(g_stka|*8,"_")!Inhaltsverz. mit Leerzeichen auffüllen
  3517.   LET g_stueck$(1)=g_stueck$(0)         ! Datumteil
  3518.   FOR s%=2 TO g_stka|+1                 ! Alle Stücke durch
  3519.     LET g_stueck$(s%)=STRING$(800,"@")  ! Mit Leerzeichen auffüllen
  3520.   NEXT s%                               ! nächstes Stück
  3521.   ' ............................................................................
  3522.   @a_alert("Gewählt: Hauptfile neuanlegen|Zieldiskette einlegen!|Danach ca 40 Sec. warten!/ok!|raus!",a|)
  3523.   IF a|=2                               ! F 'raus!' gewählt
  3524.     @a_alert("Hauptfile ist bereits zerstört!/ok!",a|)
  3525.     @1_fileselectboxfoto                ! Fileselectbox fotografieren
  3526.     GOTO raus_hauptfileneuanlegen       ! d
  3527.   ENDIF                                 ! d
  3528.   ' ............................................................................
  3529.   SGET schirm$                          ! Bildschirm retten
  3530.   PBOX 0,0,g_bb%-1,g_bh%-1              ! Bildschirm schwarz
  3531.   HIDEM                                 ! Mauspfeil weg
  3532.   OPEN "O",#1,g_hf$                     ! Hauptnotenfile öffnen
  3533.   STORE #1,g_stueck$()                  ! Array abspeichern
  3534.   CLOSE #1                              ! File schließen
  3535.   SPUT schirm$                          ! Bildschirm wieder herstellen
  3536.   SHOWM                                 ! Mauspfeil zeigen
  3537.   @1_fileselectboxfoto                  ! Fileselectbox fotografieren
  3538.   ' ............................................................................
  3539.   raus_hauptfileneuanlegen:             ! d
  3540.   PUT 0,0,kl$                           ! Klaviatur mit Hauptmenütext raus
  3541.   ' ----------------------------------------------------------------------------
  3542. RETURN
  3543. > PROCEDURE 3_dfrei(w%,VAR o!)    !_:
  3544.   ' ----------------------------------------------------------------------------
  3545.   ' Hier wird geprüft, ob noch w% Bytes auf der Diskette 'zu haben' sind.
  3546.   ' ............................................................................
  3547.   LOCAL a|                      ! Wahlvariable für's Menü
  3548.   LOCAL f%                      ! soviel freie Bytes hat's auf der Diskette
  3549.   ' ............................................................................
  3550.   LET f%=DFREE(0)               ! f% freie Bytes gibt's noch auf der Disk.
  3551.   ' ............................................................................
  3552.   IF f%>=w%                     ! f mehr als gewünscht oder gleichviel Platz:
  3553.     LET o!=TRUE                 ! 'Alles ok!' übergeben
  3554.   ELSE                          ! f weniger als gewünscht Platz auf Disk:
  3555.     @a_alert("Es sind frei:'"+STR$(f%)+"'|Es braucht aber:'"+STR$(w%)+"'/ok!",a|)
  3556.   ENDIF                         ! d
  3557.   ' ----------------------------------------------------------------------------
  3558. RETURN
  3559. > PROCEDURE 2_hauptfile_laden     !_:
  3560.   ' ----------------------------------------------------------------------------
  3561.   LOCAL dummy|                          ! Dummy für Alertbox
  3562.   LOCAL dummy%                          ! Dummy für RECALL-Befehl
  3563.   LOCAL m$                              ! Speicher für Filename
  3564.   LOCAL b$                              ! Bildspeicher
  3565.   ' ............................................................................
  3566.   SGET b$                               ! Bild retten
  3567.   SPUT g_lb$                            ! Löschbildschirm
  3568.   PRINT AT(1,1);"Gewählt: Hauptfile laden (ca 15 Sek.)";
  3569.   PRINT " bisher: '";g_hf$;"'"
  3570.   ' ............................................................................
  3571.   FILESELECT "A:\*.NTN",m$,m$           ! Fileselectbox
  3572.   ' ............................................................................
  3573.   IF m$="" OR NOT EXIST(m$)             ! F Abbruch gewählt:
  3574.     GOTO raus_2_hauptfile_laden         ! d
  3575.   ELSE                                  ! sonst:
  3576.     LET g_hf$=RIGHT$(m$,LEN(m$)-3)      ! 'A:\' wegschneiden
  3577.   ENDIF                                 ! d
  3578.   PRINT AT(65,1);"'";g_hf$;"'"          ! Nochmal Anzeige des Namens
  3579.   ' ............................................................................
  3580.   OPEN "I",#1,g_hf$                     ! Hauptnotenfile öffnen
  3581.   RECALL #1,g_stueck$(),-1,dummy%       ! Array laden
  3582.   CLOSE #1                              ! File schließen
  3583.   ' ............................................................................
  3584.   @1_fileselectboxfoto                  ! Fileselectbox fotografieren
  3585.   ' ............................................................................
  3586.   raus_2_hauptfile_laden:               ! d
  3587.   SPUT b$                               ! Bild wiederherstellen
  3588.   PUT 0,0,kl$                           ! Klaviatur mit Hauptmenütext raus
  3589.   ' ----------------------------------------------------------------------------
  3590. RETURN
  3591. > PROCEDURE 2_save_hauptfile      !_:
  3592.   ' ----------------------------------------------------------------------------
  3593.   LOCAL ok!                             ! Flag für Prüfprozedur
  3594.   LOCAL m$                              ! Speicher für Filename
  3595.   LOCAL schirm$                         ! Bildschirmspeichervariable
  3596.   LOCAL kl$                             ! Klaviaturnegativ
  3597.   ' ............................................................................
  3598.   GET 0,0,g_bb%-1,g_mh|-1,kl$           ! Klaviatur mit Hauptmenütext fotogr.
  3599.   PUT 0,0,g_kl$                         ! Klaviatur ohne Hauptmenütext raus
  3600.   PRINT AT(1,1);"Gewählt: Hauptfile abspeichern (ca 40 s)";
  3601.   PRINT " bisher: '";g_hf$;"'"
  3602.   @3_dfrei(130404,ok!)                  ! sind noch 130404 Bytes auf Disk frei?
  3603.   IF ok!=FALSE                          ! F nicht:
  3604.     GOTO raus_save_hauptfile            ! d
  3605.   ENDIF                                 ! d
  3606.   ' ............................................................................
  3607.   FILESELECT "A:\*.NTN",m$,m$           ! Fileselectbox
  3608.   ' ............................................................................
  3609.   IF m$=""                              ! F Abbruch gewählt:
  3610.     GOTO raus_save_hauptfile            ! d
  3611.   ELSE                                  ! sonst:
  3612.     LET g_hf$=RIGHT$(m$,LEN(m$)-3)      ! 'A:\' wegschneiden
  3613.   ENDIF                                 ! d
  3614.   PRINT AT(65,1);"'";g_hf$;"'"          ! Nochmal Anzeige des Namens
  3615.   ' ............................................................................
  3616.   SGET schirm$                          ! Bildschirm retten
  3617.   PBOX 0,0,g_bb%-1,g_bh%-1              ! Bildschirm schwarz
  3618.   HIDEM                                 ! Mauspfeil weg
  3619.   ' ............................................................................
  3620.   OPEN "O",#1,g_hf$                     ! Hauptnotenfile öffnen
  3621.   STORE #1,g_stueck$()                  ! Array abspeichern
  3622.   CLOSE #1                              ! File schließen
  3623.   ' ............................................................................
  3624.   SPUT schirm$                          ! Bildschirm wieder herstellen
  3625.   SHOWM                                 ! Mauspfeil zeigen
  3626.   ' ............................................................................
  3627.   raus_save_hauptfile:                  ! d
  3628.   PUT 0,0,kl$                           ! Klaviatur mit Hauptmenütext raus
  3629.   ' ----------------------------------------------------------------------------
  3630. RETURN
  3631. > PROCEDURE 2_file_loeschen       !_:
  3632.   ' ----------------------------------------------------------------------------
  3633.   LOCAL a|                              ! für Alertbox
  3634.   LOCAL m$                              ! Speicher für Filename
  3635.   LOCAL kl$                             ! Klaviaturnegativ
  3636.   ' ............................................................................
  3637.   GET 0,0,g_bb%-1,g_mh|-1,kl$           ! Klaviatur mit Hauptmenütext fotogr.
  3638.   PUT 0,0,g_kl$                         ! Klaviatur ohne Hauptmenütext raus
  3639.   PRINT AT(1,1);"Gewählt: File löschen!"! Info über gewählten Befehl
  3640.   ' ............................................................................
  3641.   nochmal_file_loeschen:                ! Wiederhol-Label
  3642.   FILESELECT "A:\*.*",m$,m$             ! Fileselectbox
  3643.   ' ............................................................................
  3644.   IF m$="" OR NOT EXIST(m$)             ! F Abbruch gewählt:
  3645.     GOTO raus_file_loeschen             ! d
  3646.   ELSE                                  ! sonst:
  3647.     LET m$=RIGHT$(m$,LEN(m$)-3)         ! 'A:\' wegschneiden
  3648.   ENDIF                                 ! d
  3649.   @a_alert("Gelöscht wird: '"+m$+"' !/ok!|raus!",a|)
  3650.   IF a|=2                               ! F Abbruch gewählt:
  3651.     GOTO raus_file_loeschen             ! d
  3652.   ENDIF                                 ! d
  3653.   PRINT AT(40,1);"'";m$;"'           "  ! Nochmal Anzeige des Namens
  3654.   ' ............................................................................
  3655.   KILL m$                               ! d
  3656.   ' ............................................................................
  3657.   GOTO nochmal_file_loeschen            ! Kreislauf, f viel gelöscht werden muß
  3658.   ' ............................................................................
  3659.   raus_file_loeschen:                   ! d
  3660.   PUT 0,0,kl$                           ! Klaviatur mit Hauptmenütext raus
  3661.   ' ----------------------------------------------------------------------------
  3662. RETURN
  3663. > PROCEDURE 2_rename_file         !_:
  3664.   ' ----------------------------------------------------------------------------
  3665.   ' Hier wird ein File auf der Diskette umbenannt.
  3666.   ' ----------------------------------------------------------------------------
  3667.   LOCAL ok!                             ! Flag für Prüfprozedur
  3668.   LOCAL a|                              ! für Alertbox
  3669.   LOCAL m$                              ! Speicher für Filename
  3670.   LOCAL neu$                            ! Speicher für neuen Namen
  3671.   LOCAL kl$                             ! Klaviaturnegativ
  3672.   ' ............................................................................
  3673.   GET 0,0,g_bb%-1,g_mh|-1,kl$           ! Klaviatur mit Hauptmenütext fotogr.
  3674.   PUT 0,0,g_kl$                         ! Klaviatur ohne Hauptmenütext raus
  3675.   PRINT AT(1,1);"Gewählt: File umbenennen! Jetzt: Umzubenennendes File anwählen!";! Info über gewählten Befehl
  3676.   ' ............................................................................
  3677.   FILESELECT "A:\*.*",m$,m$             ! Fileselectbox
  3678.   ' ............................................................................
  3679.   IF m$="" OR NOT EXIST(m$)             ! F Abbruch gewählt:
  3680.     GOTO raus_rename_file               ! d
  3681.   ELSE                                  ! sonst:
  3682.     LET m$=RIGHT$(m$,LEN(m$)-3)         ! 'A:\' wegschneiden
  3683.   ENDIF                                 ! d
  3684.   ' ............................................................................
  3685.   nochmal_rename_file:                  ! Wiederhol-Label
  3686.   PUT 0,0,g_kl$                         ! Klaviatur ohne Hauptmenütext raus
  3687.   PRINT AT(1,1);                        ! Cursor positionieren
  3688.   PRINT " Neuer Name: ";                ! Input-Info und Input platzieren
  3689.   INPUT neu$                            ! Eingabe des neuen Namens
  3690.   IF neu$="-1"                          ! F Abbruch gewählt:
  3691.     GOTO raus_rename_file               ! d
  3692.   ENDIF                                 ! d
  3693.   @3_pruef(neu$,ok!)                    ! Überprüfung der Eingabe
  3694.   IF NOT ok!                            ! F nicht ok:
  3695.     IF LEN(neu$)>12                     ! F zu lang
  3696.       LET neu$=LEFT$(neu$,12)           ! zurechtstutzen
  3697.     ENDIF                               ! d
  3698.     @a_alert("'"+neu$+"' ist unmöglicher Dateiname!/ok!|raus!",a|)
  3699.     IF a|=1                             ! F Einsicht:
  3700.       GOTO nochmal_rename_file          ! Kreislauf
  3701.     ELSE                                ! F Abbruch gewünscht:
  3702.       GOTO raus_rename_file             ! d
  3703.     ENDIF                               ! d
  3704.   ENDIF                                 ! d
  3705.   ' ............................................................................
  3706.   @a_alert("Geändert wird: '"+m$+"'|zu: '"+neu$+"'!/ok!|raus!",a|)
  3707.   IF a|=2                               ! F Abbruch gewählt:
  3708.     GOTO raus_rename_file               ! d
  3709.   ENDIF                                 ! d
  3710.   PUT 0,0,g_kl$                         ! Klaviatur ohne Hauptmenütext raus
  3711.   PRINT AT(1,1);"Jetzt wird umbenannt:  alt:'";m$;"' neu:'";neu$;"'"  ! Nochmal Anzeige der Namen
  3712.   ' ............................................................................
  3713.   RENAME m$ AS neu$                     ! File umbenennen
  3714.   ' ............................................................................
  3715.   raus_rename_file:                     ! d
  3716.   PUT 0,0,kl$                           ! Klaviatur mit Hauptmenütext raus
  3717.   ' ----------------------------------------------------------------------------
  3718. RETURN
  3719. > PROCEDURE 3_pruef(n$,VAR o!)    !_:
  3720.   ' ----------------------------------------------------------------------------
  3721.   ' n$                          ! zu überprüfender Dateiname
  3722.   ' o!                          ! =-1 falls Dateiname ok
  3723.   LOCAL fehler!                 ! Flag für 'Fehler gefunden'
  3724.   LOCAL i|                      ! Zähler für Zeichen
  3725.   LOCAL asc|                    ! Ascii-Wert des aktuellen Zeichens
  3726.   LOCAL ext$                    ! Extension
  3727.   LOCAL name$                   ! Filename ohne Extension
  3728.   LOCAL pkt$                    ! Punkt zwischen Filename und Extension
  3729.   ' ............................................................................
  3730.   '                             ! Dateiname sollte z.B. so aussehen:'NAME.EXT'
  3731.   ' ............................................................................
  3732.   IF LEN(n$)<5                  ! '.EXT' + ein Zeichen brauchts mindestens
  3733.     LET fehler!=TRUE            ! Fehler gefunden
  3734.     GOTO raus_pruef             ! d
  3735.   ENDIF                         ! d
  3736.   ' ............................................................................
  3737.   LET ext$=RIGHT$(n$,3)         ! Extension ausschneiden
  3738.   LET name$=LEFT$(n$,LEN(n$)-4) ! Name ausschneiden
  3739.   LET pkt$=LEFT$(RIGHT$(n$,4),1)! Punkt ausschneiden
  3740.   ' ............................................................................
  3741.   IF pkt$<>"."                  ! F hier kein Punkt zu sehen:
  3742.     LET fehler!=TRUE            ! Fehler gefunden
  3743.     GOTO raus_pruef             ! d
  3744.   ENDIF                         ! d
  3745.   ' ............................................................................
  3746.   FOR i|=1 TO LEN(name$)        ! Name durch
  3747.     LET asc|=ASC(MID$(name$,i|,1)) ! Ascci-wert festhalten
  3748.     IF asc|<65 OR asc|>90       ! F außerhalb großer Buchstaben
  3749.       IF NOT (asc|>47 AND asc|<58) ! F keine Ziffer:
  3750.         LET fehler!=TRUE        ! Fehler gefunden
  3751.       ENDIF                     ! d
  3752.     ENDIF                       ! d
  3753.   NEXT i|                       ! nächster Buchstabe des Namens
  3754.   ' ............................................................................
  3755.   FOR i|=1 TO LEN(ext$)         ! Extension durch
  3756.     LET asc|=ASC(MID$(ext$,i|,1)) ! Ascci-wert festhalten
  3757.     IF asc|<65 OR asc|>91       ! F außerhalb großer Buchstaben
  3758.       IF NOT (asc|>47 AND asc|<58) ! F keine Ziffer:
  3759.         LET fehler!=TRUE        ! Fehler gefunden
  3760.       ENDIF                     ! d
  3761.     ENDIF                       ! d
  3762.   NEXT i|                       ! nächster Buchstabe des Extensions
  3763.   ' ............................................................................
  3764.   raus_pruef:                   ! d
  3765.   IF NOT fehler!                ! F keinen Fehler gefunden
  3766.     LET o!=TRUE                 ! Rückgabeparameter auf 'Alles ok' setzen
  3767.   ENDIF                         ! d
  3768.   ' ----------------------------------------------------------------------------
  3769. RETURN
  3770. > PROCEDURE 2_inhverz_drucken     !_:
  3771.   ' ----------------------------------------------------------------------------
  3772.   ' Hier wird das Inhaltsverzeichnis des Hauptfiles gedruckt, mit Datum,
  3773.   ' physikalischer und alphabetischer Stücknummer und zwar zweispaltig in
  3774.   ' Superscript.
  3775.   ' ----------------------------------------------------------------------------
  3776.   LOCAL i|                              ! Zähler für die einzelnen Stücke
  3777.   LOCAL schirm$                         ! Bildschirmspeichervariable
  3778.   DIM i$(g_stka|)                       ! Array für die 160 Textzeilen
  3779.   ' ............................................................................
  3780.   '     1.)  T e x t z e i l e n  k o n s t r u i e r e n :
  3781.   ' ............................................................................
  3782.   FOR i|=1 TO g_stka|                   ! Alle Stücke durch, physikalisch
  3783.     LET name$=MID$(g_stueck$(0),(i|-1)*8+1,8) ! Stückname ermitteln
  3784.     LET datu$=MID$(g_stueck$(1),(i|-1)*8+1,8) ! Datum ermitteln
  3785.     LET alph$=STRING$(3-LEN(STR$(i|)),"0")+STR$(i|) ! Alphabetische Stücknummer
  3786.     LET i$(i|)=name$+" | "+datu$+" | "+alph$+" | " ! Zeile für i|-tes Stück
  3787.   NEXT i|                               ! nächstes Stück
  3788.   ' ............................................................................
  3789.   QSORT i$(),g_stka|+1                  ! Sortieren, alphabetisch
  3790.   ' ............................................................................
  3791.   FOR i|=1 TO g_stka|                   ! Alle Stücke durch, alphabetisch
  3792.     LET phys$=STRING$(3-LEN(STR$(i|)),"0")+STR$(i|) ! physikalische Stücknummer
  3793.     LET i$(i|)=i$(i|)+phys$             ! physikalische Stücknummer dranhängen
  3794.   NEXT i|                               ! nächstes Stück
  3795.   ' ............................................................................
  3796.   FOR i|=1 TO g_stka|/2                 ! Alle Stücke durch, alphabetisch
  3797.     LET i$(i|)=i$(i|)+"    "+i$(i|+80)  ! beide Spalten in eine Zeile
  3798.   NEXT i|                               ! nächstes Stück
  3799.   ' ............................................................................
  3800.   '     2.)  A u s d r u c k e n
  3801.   ' ............................................................................
  3802.   @a_alert("Wirklich drucken?/Ja|Nein",r|) ! d
  3803.   IF r|=2                               ! F Abbruch gewählt:
  3804.     GOTO raus_inhverz                   ! raus
  3805.   ENDIF                                 ! d
  3806.   ' ............................................................................
  3807.   SGET schirm$                          ! Bildschirm retten
  3808.   PBOX 0,0,g_bb%-1,g_bh%-1              ! Bildschirm schwarz
  3809.   HIDEM                                 ! Mauspfeil weg
  3810.   ' ............................................................................
  3811.   LPRINT CHR$(27);CHR$(64);             ! resets the printer
  3812.   LPRINT CHR$(27);CHR$(83);CHR$(0);     ! selects superscripts
  3813.   '  LPRINT CHR$(27);CHR$(69);             ! selects emphasized printing
  3814.   LPRINT CHR$(27);CHR$(51);CHR$(24);    ! sets line spacing to n/216 inch
  3815.   LPRINT CHR$(27);CHR$(108);CHR$(10);   ! stets the left margin
  3816.   ' ............................................................................
  3817.   FOR i|=1 TO g_stka|/2                 ! Alle Stücke durch, alphabetisch
  3818.     LPRINT i$(i|)                       ! Doppelspaltenzeile drucken, also Infos
  3819.     '                                   ! für i|-tes  u n d  i|+80-tes Stück.
  3820.   NEXT i|                               ! nächstes Stück
  3821.   ' ............................................................................
  3822.   SPUT schirm$                          ! Bildschirm wieder herstellen
  3823.   SHOWM                                 ! Mauspfeil zeigen
  3824.   ' ............................................................................
  3825.   raus_inhverz:                         ! Rauslabel
  3826.   ERASE i$()                            ! Array für die 160 Textzeilen löschen
  3827.   ' ----------------------------------------------------------------------------
  3828. RETURN
  3829. > PROCEDURE 2_drucken_ab_x_alle   !_:
  3830.   ' ----------------------------------------------------------------------------
  3831.   ' Notentexte werden gedruckt; alle Stücke ab der x-ten Stelle im alphabetisch
  3832.   ' geordneten Inhaltsverzeichnis. Außer Punkt 2.) und Punkt 3.) stimmt diese
  3833.   ' Prozedur so ziemlich mit der '2_drucken_gewaehlt' überein.
  3834.   ' ----------------------------------------------------------------------------
  3835.   LOCAL r!                              ! Rausvariable 1
  3836.   LOCAL r|                              ! Rausvariable 2
  3837.   LOCAL i|                              ! Stückzähler
  3838.   LOCAL m_mn%                           ! Merker für letzte Note
  3839.   LOCAL m_n%                            ! Merker für Cursorposition
  3840.   LOCAL x%                              ! Beginnummer
  3841.   LOCAL a$                              ! Zwischenspeicher für Notencode
  3842.   LOCAL s$                              ! Abkürzungsvariable
  3843.   LOCAL bld$                            ! Bildschirmrettungsnegativ
  3844.   LOCAL name$                           ! Name des aktuellen Stücks
  3845.   DIM w!(g_stka|)                       ! Auswahlarray, Eintrag=-1,f entspr.
  3846.   '                                     ! Stück ausgewählt worden ist.
  3847.   DIM w|(g_stka|)                       ! Alphabetnummerarray löschen
  3848.   DIM m_n$(g_os%)                       ! Zwischenspeicher für akt. Stück
  3849.   DIM a$(g_stka|)                       ! Menüeintragsfelderarray dim.
  3850.   DIM a%(g_stka|)                       ! Nummerierungsarray dim.
  3851.   ' ............................................................................
  3852.   '     1.)  l e t z t e s  S t ü c k  r e t t e n :
  3853.   ' ............................................................................
  3854.   SGET bld$                             ! Bildschirm retten
  3855.   LET name$=g_fn$                       ! Name des aktuellen Stücks retten
  3856.   LET m_mn%=g_mn%                       ! letzte Note des akt. Stücks merken
  3857.   LET m_n%=g_n%                         ! Cursorposition des akt. Stücks merken
  3858.   IF m_mn%<>0                           ! F vor Druckbefehl Stück im Speicher:
  3859.     FOR n%=1 TO g_mn%                   ! Alle Noten des akt. Stücks durch
  3860.       LET m_n$(n%)=g_n$(n%)             ! Stück in Speicherstring
  3861.     NEXT n%                             ! nächste Note des akt. Stücks
  3862.   ENDIF                                 ! d
  3863.   ' ............................................................................
  3864.   '     2.)  V o r b e r e i t u n g e n :
  3865.   ' ............................................................................
  3866.   PUT g_x%(g_n%),g_y%(g_n%),g_cs$,9     ! Cusor aus
  3867.   PRINT AT(1,1);"Ab welcher Stelle im Inhaltsverz. soll gedruckt werden (raus:'-1') ";
  3868.   INPUT x%                              ! Beginnummer
  3869.   IF x%<1 OR x%>g_stka|                 ! F Abbruch gewählt
  3870.     GOTO raus_drucken_ab_x_alle         ! uverrichteter Dinge raus
  3871.   ENDIF                                 ! d
  3872.   ' ............................................................................
  3873.   '     3.)  D r u c k b i l d e r   h e r s t e l l e n :
  3874.   ' ............................................................................
  3875.   FOR i|=1 TO g_stka|                           ! Alle Menüeinträge durch
  3876.     LET a$(i|)=MID$(g_stueck$(0),(i|-1)*8+1,8)  ! Ins Menüeintragsfeld kopieren
  3877.     LET a%(i|)=i|                               ! Nummerierungsarrayeintrag
  3878.   NEXT i|                                       ! nächster Menüeintrag
  3879.   ' ............................................................................
  3880.   QSORT a$(),g_stka|+1,a%()                     ! Sortieren, alphabetisch, in
  3881.   '                                             ! a%() wird die physikalische
  3882.   '                                             ! Nr. mitsortiert.
  3883.   ' ............................................................................
  3884.   FOR i|=x% TO g_stka|                          ! Alle Menüeinträge ab x| durch
  3885.     EXIT IF LEFT$(g_stueck$(a%(i|)+1),4)="@@@@" ! raus f leeres Stück
  3886.     '                                           ! in alphabetischer Reihenfolge
  3887.     @3_dr_st(a%(i|),i|,r!)                      ! Eine Ebene weiter zum Drucken
  3888.     IF r!=TRUE                                  ! F abgebrochen:
  3889.       LET r!=FALSE                              ! d
  3890.       @a_alert("Ganz abbrechen?/Ja|Nein",r|)    ! d
  3891.       EXIT IF r|=1                              ! Raus f ja gewählt:
  3892.     ENDIF                                       ! d
  3893.     EXIT IF r|=1                                ! Raus f ja gewählt:
  3894.   NEXT i|                                       ! nächster Menüeintrag
  3895.   ' ............................................................................
  3896.   '     4.)  S t ü c k  w i e d e r h e r s t e l l e n :
  3897.   ' ............................................................................
  3898.   raus_drucken_ab_x_alle:               ! Rauslabel
  3899.   IF m_mn%<>0                           ! F vor Druckbefehl Stück im Speicher:
  3900.     FOR n%=1 TO m_mn%                   ! Alle Noten des akt. Stücks durch
  3901.       LET g_n$(n%)=m_n$(n%)             ! Stück von Speicherstring in Arbeitsstr
  3902.     NEXT n%                             ! nächste Note des akt. Stücks
  3903.   ENDIF                                 ! d
  3904.   LET g_fn$=name$                       ! Name des aktuellen Stücks wiederherst.
  3905.   LET g_n%=m_n%                         ! Cursor wo er früher war
  3906.   LET g_mn%=m_mn%                       ! vorher akt. Stück
  3907.   SPUT bld$                             ! Bildschirm wiederherstellen
  3908.   ERASE w!()                            ! Wahlarray löschen
  3909.   ERASE w|()                            ! Alphabetnummerarray löschen
  3910.   ERASE m_n$()                          ! Speicherarray löschen
  3911.   ERASE a$()                            ! Menüeintragsarray löschen
  3912.   ERASE a%()                            ! Nummerierungsarray löschen
  3913.   ' ----------------------------------------------------------------------------
  3914. RETURN
  3915. > PROCEDURE 2_spielen_ab_x_alle   !_:
  3916.   ' ----------------------------------------------------------------------------
  3917.   ' Notentexte werden gespielt; alle Stücke ab der x-ten Stelle im alphabetisch
  3918.   ' geordneten Inhaltsverzeichnis. Außer Punkt 2.) und Punkt 3.) stimmt diese
  3919.   ' Prozedur so ziemlich mit der '2_drucken_gewaehlt' überein.
  3920.   ' ----------------------------------------------------------------------------
  3921.   LOCAL r!                              ! Rausvariable 1
  3922.   LOCAL r|                              ! Rausvariable 2
  3923.   LOCAL i|                              ! Stückzähler
  3924.   LOCAL m_mn%                           ! Merker für letzte Note
  3925.   LOCAL m_n%                            ! Merker für Cursorposition
  3926.   LOCAL x%                              ! Beginnummer
  3927.   LOCAL a$                              ! Zwischenspeicher für Notencode
  3928.   LOCAL s$                              ! Abkürzungsvariable
  3929.   LOCAL bld$                            ! Bildschirmrettungsnegativ
  3930.   LOCAL name$                           ! Namensretter
  3931.   DIM w!(g_stka|)                       ! Auswahlarray, Eintrag=-1,f entspr.
  3932.   '                                     ! Stück ausgewählt worden ist.
  3933.   DIM w|(g_stka|)                       ! Alphabetnummerarray löschen
  3934.   DIM m_n$(g_os%)                       ! Zwischenspeicher für akt. Stück
  3935.   DIM a$(g_stka|)                       ! Menüeintragsfelderarray dim.
  3936.   DIM a%(g_stka|)                       ! Nummerierungsarray dim.
  3937.   ' ............................................................................
  3938.   '     1.)  l e t z t e s  S t ü c k  r e t t e n :
  3939.   ' ............................................................................
  3940.   SGET bld$                             ! Bildschirm retten
  3941.   LET m_mn%=g_mn%                       ! letzte Note des akt. Stücks merken
  3942.   LET m_n%=g_n%                         ! Cursorposition des akt. Stücks merken
  3943.   LET name$=g_fn$                       ! Name des aktuellen Stücks retten
  3944.   IF m_mn%<>0                           ! F vor Druckbefehl Stück im Speicher:
  3945.     FOR n%=1 TO g_mn%                   ! Alle Noten des akt. Stücks durch
  3946.       LET m_n$(n%)=g_n$(n%)             ! Stück in Speicherstring
  3947.     NEXT n%                             ! nächste Note des akt. Stücks
  3948.   ENDIF                                 ! d
  3949.   ' ............................................................................
  3950.   '     2.)  V o r b e r e i t u n g e n :
  3951.   ' ............................................................................
  3952.   PUT g_x%(g_n%),g_y%(g_n%),g_cs$,9     ! Cusor aus
  3953.   PRINT AT(1,1);"Ab welcher Stelle im Inhaltsverz. soll gespielt werden (raus:'-1') ";
  3954.   INPUT x%                              ! Beginnummer
  3955.   IF x%<1 OR x%>g_stka|                 ! F Abbruch gewählt
  3956.     GOTO raus_spielen_ab_x_alle         ! uverrichteter Dinge raus
  3957.   ENDIF                                 ! d
  3958.   ' ............................................................................
  3959.   '     3.)  S p i e l b i l d e r   h e r s t e l l e n :
  3960.   ' ............................................................................
  3961.   FOR i|=1 TO g_stka|                           ! Alle Menüeinträge durch
  3962.     LET a$(i|)=MID$(g_stueck$(0),(i|-1)*8+1,8)  ! Ins Menüeintragsfeld kopieren
  3963.     LET a%(i|)=i|                               ! Nummerierungsarrayeintrag
  3964.   NEXT i|                                       ! nächster Menüeintrag
  3965.   ' ............................................................................
  3966.   QSORT a$(),g_stka|+1,a%()                     ! Sortieren, alphabetisch, in
  3967.   '                                             ! a%() wird die physikalische
  3968.   '                                             ! Nr. mitsortiert.
  3969.   ' ............................................................................
  3970.   FOR i|=x% TO g_stka|                          ! Alle Menüeinträge ab x| durch
  3971.     '                                           ! in alphabetischer Reihenfolge
  3972.     LET s$=g_stueck$(a%(i|)+1)                  ! Stück kopieren
  3973.     EXIT IF LEFT$(s$,4)="@@@@"                  ! Raus f leeres Stück
  3974.     FOR j|=1 TO g_os%                           ! Alle Noten des i|-ten St.durch
  3975.       LET g_n$(j|)=MID$(s$,(j|-1)*4+1,4)        ! ins aktuelle Stück kopieren
  3976.       EXIT IF g_n$(j|)="@@@@"                   ! F leere Note
  3977.     NEXT j|                                     ! nächste Note
  3978.     LET g_mn%=j|-1                              ! letzte Notennummer
  3979.     LET g_n%=g_mn%                              ! Cursor auf Stückende
  3980.     SPUT g_lb$                                  ! Bild v.Text und Noten reinigen
  3981.     @2_stueck_ganz_zeigen                       ! 'Geladenes' Stück auf Schirm
  3982.     PRINT AT(1,1);a$(i|);" alph.Nr.:'";i|;"' phys.Nr.:'";a%(i|);"' " ! Info
  3983.     PUT g_x%(g_n%),g_y%(g_n%),g_cs$,9           ! Cusor ein
  3984.     @2_abspielen(1,g_mn%)                       ! Stück spielen
  3985.     PAUSE g_sp%                                 ! Pause
  3986.     IF g_midi!                                  ! F Midi ein
  3987.       @3_stimme1                                ! Sound für Kanal 1 zufällig
  3988.       @3_stimme2                                ! Sound für Kanal 2 zufällig
  3989.     ENDIF                                       ! d
  3990.     EXIT IF ASC(INKEY$)=27                      ! Raus f Escape-Taste
  3991.   NEXT i|                                       ! nächster Menüeintrag
  3992.   ' ............................................................................
  3993.   '     4.)  S t ü c k  w i e d e r h e r s t e l l e n :
  3994.   ' ............................................................................
  3995.   raus_spielen_ab_x_alle:               ! Rauslabel
  3996.   SPUT g_lb$                            ! Bild v.Text und Noten reinigen
  3997.   IF m_mn%<>0                           ! F vor Druckbefehl Stück im Speicher:
  3998.     FOR n%=1 TO m_mn%                   ! Alle Noten des akt. Stücks durch
  3999.       LET g_n$(n%)=m_n$(n%)             ! Stück von Speicherstring in Arbeitsstr
  4000.     NEXT n%                             ! nächste Note des akt. Stücks
  4001.   ENDIF                                 ! d
  4002.   LET g_fn$=name$                       ! Name des aktuellen Stücks wiederherst.
  4003.   LET g_n%=m_n%                         ! Cursor wo er früher war
  4004.   LET g_mn%=m_mn%                       ! vorher akt. Stück
  4005.   SPUT bld$                             ! Bildschirm wiederherstellen
  4006.   ERASE w!()                            ! Wahlarray löschen
  4007.   ERASE w|()                            ! Alphabetnummerarray löschen
  4008.   ERASE m_n$()                          ! Speicherarray löschen
  4009.   ERASE a$()                            ! Menüeintragsarray löschen
  4010.   ERASE a%()                            ! Nummerierungsarray löschen
  4011.   ' ----------------------------------------------------------------------------
  4012. RETURN
  4013. > PROCEDURE 3_stimme1             !_:
  4014.   ' ----------------------------------------------------------------------------
  4015.   REPEAT                        ! Zufallsschleife
  4016.     LET i=RANDOM(28)            ! zufällig wählen
  4017.   UNTIL i=0 OR i=2 OR i=3 OR i=4 OR i=10 OR i=13 OR i=20 OR i=25 OR i=26 OR i=27
  4018.   OUT 3,192,i                   ! Sound für Kanal 1 einstellen
  4019.   ' ----------------------------------------------------------------------------
  4020. RETURN
  4021. > PROCEDURE 3_stimme2             !_:
  4022.   ' ----------------------------------------------------------------------------
  4023.   REPEAT                        ! Zufallsschleife
  4024.     LET i=RANDOM(30)            ! zufällig wählen
  4025.   UNTIL i=7 OR i=8 OR i=15 OR i=18 OR i=23 OR i=24 OR i=29
  4026.   OUT 3,193,i                   ! Sound für Kanal 2 einstellen
  4027.   ' ----------------------------------------------------------------------------
  4028. RETURN
  4029. ' ------------------------------------------------------------------------------
  4030. > PROCEDURE 1_blockmark(i|)       !_:
  4031.   ' ----------------------------------------------------------------------------
  4032.   ' i|      ! =1: Blockanfang soll gesetzt werden, =2: Blockende
  4033.   '           =3: Blockmarken löschen
  4034.   LOCAL alt_ble%                  ! altes Blockende merken
  4035.   ' ----------------------------------------------------------------------------
  4036.   IF g_n%>g_mn% AND g_mn%>1       ! F Endschreibmodus eingeschaltet,ausschalten:
  4037.     PUT g_x%(g_n%),g_y%(g_n%),g_cs$,9 ! Cusor aus
  4038.     LET g_n%=g_mn%                ! Cursor auf Notentextende setzen
  4039.     PUT g_x%(g_n%),g_y%(g_n%),g_cs$,9 ! Cusor ein
  4040.   ENDIF                           ! d
  4041.   ' ............................................................................
  4042.   IF g_bla%=0 AND g_ble%=0 AND i|=1 ! 1.) F Blockm nicht gesetzt: Blockanfang
  4043.     ' ..........................................................................
  4044.     '                             ! Blockanfang:
  4045.     IF g_n%<g_mn%-3 AND i|=1      ! F Block mindestens 3 Noten lang werden kann:
  4046.       LET g_bla%=g_n%             ! Blockanfang setzen
  4047.       LET g_ble%=g_mn%            ! Blockende auf Notentextende setzen
  4048.       PUT g_x%(g_n%),g_y%(g_n%),g_cs$,9 ! Cusor aus
  4049.       IF g_mn%=g_os%              ! F 200 Noten
  4050.         LET g_n%=g_mn%            ! Cursor auf letzte Note
  4051.       ELSE                        ! sonst:
  4052.         LET g_n%=g_mn%+1          ! Endschreibmodus ein, d.h. Cursor>letzte Note
  4053.       ENDIF                       ! d
  4054.       PUT g_x%(g_n%),g_y%(g_n%),g_cs$,9 ! Cusor ein
  4055.       @2_invers(g_bla%,g_mn%)     ! Ab Note g_bla% Rest des Notenstücks invers
  4056.     ENDIF                         ! d
  4057.     ' ..........................................................................
  4058.   ELSE IF g_bla%<>0 AND i|=3      ! 2.) F Blockanf.gesetzt:  Blockmarken löschen
  4059.     ' ..........................................................................
  4060.     @2_invers(g_bla%,g_ble%)      ! Blockmarkierung löschen
  4061.     LET g_bla%=0                  ! Blockanfang löschen
  4062.     LET g_ble%=0                  ! Blockende löschen
  4063.     ' ..........................................................................
  4064.     raus_blockmark:               ! d
  4065.     ' ..........................................................................
  4066.     ' F Block >= 3 Noten lang und Blanf. gesetzt und Curs<Blende und i|=2:
  4067.   ELSE IF g_n%-g_bla%>=3 AND g_bla%<>0 AND g_n%<g_ble% AND i|=2 ! 3.) Blockende
  4068.     LET alt_ble%=g_ble%           ! altes Blockende merken
  4069.     LET g_ble%=g_n%               ! Blockende setzen
  4070.     PUT g_x%(g_n%),g_y%(g_n%),g_cs$,9 ! Cusor aus
  4071.     IF g_mn%=g_os%                ! F 200 Noten
  4072.       LET g_n%=g_mn%              ! Cursor auf letzte Note
  4073.     ELSE                          ! sonst:
  4074.       LET g_n%=g_mn%+1            ! Cursorpos hinter Textende (Endschreibmodus)
  4075.     ENDIF                         ! d
  4076.     PUT g_x%(g_n%),g_y%(g_n%),g_cs$,9 ! Cusor ein
  4077.     @2_invers(g_ble%+1,alt_ble%)  ! Ab Note g_ble%+1 Rest invers, da bisher:
  4078.     '                             ! ab Note g_bla% Rest invers, ist jetzt der
  4079.     '                             ! Blockbereich vollständig markiert
  4080.     ' ..........................................................................
  4081.   ENDIF                           ! d
  4082.   ' ----------------------------------------------------------------------------
  4083. RETURN
  4084. > PROCEDURE 2_invers(a%,b%)       !_:
  4085.   ' ----------------------------------------------------------------------------
  4086.   ' Diese Prozedur invertiert den Notentext von einschließlich Note a% bis e.b%
  4087.   ' und zwar zwischen der 1. und der 5. Notenlinie. Würde die ganze Zeile in-
  4088.   ' vertiert, könnte man den Cursor vom Blockbereich am Rand nicht mehr unter-
  4089.   ' scheiden.
  4090.   ' Man muß 2 Fälle betrachten:
  4091.   ' 1.) Die Noten a% und b% liegen in derselben Zeile:
  4092.   '     Also ist von einschl. a% bis einschl. b% ein Rechteck zu invertieren.
  4093.   ' 2.) Die Note b% liegt in einer Zeile unterhalb der von a%, dann:
  4094.   '   a) Zeile von a% ab a% einschließlich invertieren
  4095.   '   b) Zeile von b% bis b% einschließlich invertieren
  4096.   '   c) Zeilen dazwischen - sofern vorhanden - invertieren
  4097.   ' ----------------------------------------------------------------------------
  4098.   LOCAL za|                     ! Zeile von a%
  4099.   LOCAL zb|                     ! Zeile von b%
  4100.   LOCAL aktz|                   ! akt. Zeile der Zwischenzeilenschleife (2.c)
  4101.   LOCAL o|                      ! Diff. 1.linie v.ob. Zlnrnd (s.a.'Notenlinien')
  4102.   LOCAL u|                      ! o|+Diff. 5.Notenlinie von unterem Zeilenrand
  4103.   LOCAL a$                      ! Negativstring
  4104.   ' ----------------------------------------------------------------------------
  4105.   IF a%>b%                      ! F plödsinnige Übergabewerte:
  4106.     GOTO raus_invers            ! hau ab!
  4107.   ENDIF                         ! d
  4108.   ' ............................................................................
  4109.   LET za|=TRUNC((a%-1)/g_npz|)+1! Zeile von a%=tr.(akt.Note-1/Noten proZeile)+1
  4110.   LET zb|=TRUNC((b%-1)/g_npz|)+1! Zeile von b%=tr.(akt.Note-1/Noten proZeile)+1
  4111.   LET o|=30                     ! Pos. 1.Notenlinie: g_y%(?)+n1y|
  4112.   LET u|=o|+19                  ! o|+5.Notenlinie (Diff.von unterem Zeilenrand)
  4113.   ' ............................................................................
  4114.   IF za|=zb|                    ! 1.) a% und b% liegen in derselben Zeile:
  4115.     ' ..........................................................................
  4116.     LET x1%=g_x%(a%)            ! links = Start-x-Koord. von Note a%
  4117.     LET y1%=g_y%(a%)+o|         ! oben  = Start-y-Koord. von Note a%
  4118.     LET x2%=g_x%(b%)+g_nb|-1    ! rechts= Start-x-Koord. Note b% + Notenbr.-1Pkt
  4119.     LET y2%=y1%+g_nzlh|-2-u|    ! unten = oben + Zeilenhöhe - 2 (-2=Rand)
  4120.     GET x1%,y1%,x2%,y2%,a$      ! Bereich fotografieren
  4121.     PUT x1%,y1%,a$,8            ! Bereich invertiert ausgeben
  4122.     ' ..........................................................................
  4123.   ELSE IF za|<zb|               ! 2.) a% und b% liegen in verschiedenen Zeilen:
  4124.     ' ..........................................................................
  4125.     '                           ! a) Zeile von a% ab a% einschl. invertieren:
  4126.     ' ..........................................................................
  4127.     LET x1%=g_x%(a%)            ! links = Start-x-Koord. von Note a%
  4128.     LET y1%=g_y%(a%)+o|         ! oben  = Start-y-Koord. von Note a%
  4129.     LET x2%=g_bb%-1             ! rechts= Bildschirmbreite - 1 Punkt
  4130.     LET y2%=y1%+g_nzlh|-2-u|    ! unten = oben + Zeilenhöhe - 2 (-2=Rand)
  4131.     GET x1%,y1%,x2%,y2%,a$      ! Bereich fotografieren
  4132.     PUT x1%,y1%,a$,8            ! Bereich invertiert ausgeben
  4133.     ' ..........................................................................
  4134.     '                           ! b) Zeile von b% bis b% einschl. invertieren:
  4135.     ' ..........................................................................
  4136.     LET x1%=0                   ! links = 0
  4137.     LET y1%=g_y%(b%)+o|         ! oben  = Start-y-Koord. von Note b%
  4138.     LET x2%=g_x%(b%)+g_nb|-1    ! rechts= Start-x-K. b% + Notenbreite - 1 Punkt
  4139.     LET y2%=y1%+g_nzlh|-2-u|    ! unten = oben + Zeilenhöhe - 2 (-2=Rand)
  4140.     GET x1%,y1%,x2%,y2%,a$      ! Bereich fotografieren
  4141.     PUT x1%,y1%,a$,8            ! Bereich invertiert ausgeben
  4142.     ' ..........................................................................
  4143.     '                           ! c) Zeilen dazw.-falls vorhanden-invertieren:
  4144.     ' ..........................................................................
  4145.     LET aktz|=za|+1             ! Startzeile sei Zeile unter der von der Note a%
  4146.     WHILE aktz|<zb|             ! Solange aktz| echt zwischen za| und zb| liegt:
  4147.       LET n%=aktz|*g_npz|       ! letzteNote in akt. Zeile=akt.Zle*NotenproZle+1
  4148.       LET x1%=0                 ! links = 0
  4149.       LET y1%=g_y%(n%)+o|       ! oben  = Start-y-Koord. von Note n%
  4150.       LET x2%=g_bb%-1           ! rechts= Bildschirmbreite - 1 Punkt
  4151.       LET y2%=y1%+g_nzlh|-2-u|  ! unten = oben + Zeilenhöhe - 2 (-2=Rand)
  4152.       GET x1%,y1%,x2%,y2%,a$    ! Bereich fotografieren
  4153.       PUT x1%,y1%,a$,8          ! Bereich invertiert ausgeben
  4154.       INC aktz|                 ! Aktuelle Zeile um eins erhöhen
  4155.     WEND                        ! Schleifenende
  4156.     ' ..........................................................................
  4157.   ENDIF                         ! EFU a%,b% liegen in gleichen/versch. Zeilen
  4158.   '  PRINT AT(1,1);"a%,b%,g_bla%,g_ble%,za|,zb|,aktz|"
  4159.   '  PRINT AT(1,2);a%,b%,g_bla%,g_ble%,za|,zb|,aktz|
  4160.   '  STOP
  4161.   ' ............................................................................
  4162.   raus_invers:                  ! d
  4163.   ' ----------------------------------------------------------------------------
  4164. RETURN
  4165. > PROCEDURE 1_block_kopieren      !_:
  4166.   ' ----------------------------------------------------------------------------
  4167.   ' Der Blockbereich wird an die Stelle vor den Cursor kopiert.
  4168.   ' ----------------------------------------------------------------------------
  4169.   LOCAL n%                      ! Notenpositionszähler
  4170.   LOCAL i%                      ! Zähler für Zwischenspeicherfüllschleife
  4171.   LOCAL bl_l%                   ! Blocklänge
  4172.   ' ............................................................................
  4173.   LET bl_l%=g_ble%-g_bla%+1     ! Blocklänge in Noten (einschl. Blockgrenzen)
  4174.   ' ............................................................................
  4175.   ' 1.) Raus bei fehlerhaften Voraussetzungen:
  4176.   ' ............................................................................
  4177.   IF g_mn%+bl_l%>g_os%          ! F neuer Text zu groß würde:
  4178.     GOTO raus_block_kopieren    ! raus
  4179.   ENDIF                         ! d
  4180.   IF g_n%>g_bla% AND g_n%<g_ble%! F Cursor innerhalb vom Block:
  4181.     GOTO raus_block_kopieren    ! raus
  4182.   ENDIF                         ! d
  4183.   IF g_bla%=0 OR g_ble%=0       ! F Blockanfang oder - ende nicht gesetzt:
  4184.     GOTO raus_block_kopieren    ! raus
  4185.   ENDIF                         ! d
  4186.   DIM n$(bl_l%)                 ! Zwischenspeicherarray dimensionieren: Erst
  4187.   '                             ! nachdem sichergestellt ist, daß Block fertig.
  4188.   ' ............................................................................
  4189.   ' 2. Blockbereich in einen Zwischenspeicher:
  4190.   ' ............................................................................
  4191.   LET n%=bl_l%+1                ! Zähler für Zwischenspeicherarray setzen
  4192.   FOR i%=g_bla% TO g_ble%       ! Den ganzen Block einschl. Blockgrenzen durch:
  4193.     DEC n%                      ! Normalen Zähler -1, denn von oben nach unten:
  4194.     LET n$(n%)=g_n$(i%)         ! Zwischenspeicherarray füllen
  4195.   NEXT i%                       ! nächste Note im Block
  4196.   ' ............................................................................
  4197.   ' 3. Den Inhalt des Zwischenspeichers an Position n% einfügen:
  4198.   ' ............................................................................
  4199.   FOR n%=1 TO bl_l%             ! den ganzen Block nochmal durch
  4200.     INSERT g_n$(g_n%)=n$(n%)    ! Zwischenspeicherarray an Position n% einfügen
  4201.   NEXT n%                       ! nächste Note im Zwischenspeicherarray
  4202.   ' ............................................................................
  4203.   ' 4. Den veränderten Text darstellen
  4204.   ' ............................................................................
  4205.   LET g_mn%=g_mn%+bl_l%         ! Neue Endnotennummer festsetzen
  4206.   SPUT g_lb$                    ! Bild von Noten reinigen (Löschbild)
  4207.   @2_stueck_ganz_zeigen         ! Geladenes Stück auf Bildschirm
  4208.   IF g_mn%=g_os%                ! F 200 Noten
  4209.     LET g_n%=g_mn%              ! Cursor auf letzte Note
  4210.   ELSE                          ! d
  4211.     LET g_n%=g_mn%+1            ! Notencursor hinter Stückende: erst hier,
  4212.     '                           ! da in 'geladenes_stueck' for-Schleife
  4213.   ENDIF                         ! d
  4214.   PUT g_x%(g_n%),g_y%(g_n%),g_cs$,9   ! Cusor ein
  4215.   LET g_bla%=0                  ! Blockanfang löschen
  4216.   LET g_ble%=0                  ! Blockende löschen
  4217.   ' ............................................................................
  4218.   raus_block_kopieren:          ! d
  4219.   ERASE n$()                    ! Zwischenspeicherarray löschen
  4220.   ' ----------------------------------------------------------------------------
  4221. RETURN
  4222. > PROCEDURE 1_block_loeschen      !_:
  4223.   ' ----------------------------------------------------------------------------
  4224.   ' Die Noten im Blockbereich werden gelöscht. Der Befehl muß bestätigt werden.
  4225.   ' ----------------------------------------------------------------------------
  4226.   LOCAL a|                      ! Wahlvariable für Alertbox
  4227.   LOCAL n%                      ! Notenpositionszähler
  4228.   LOCAL bl_l%                   ! Blocklänge
  4229.   ' ............................................................................
  4230.   IF g_bla%<>0 AND g_ble%<>0    ! F Block bereits vollständig markiert
  4231.     @a_alert("Wirklich löschen?/Ja|Nein",a|)
  4232.     IF a|=2                     ! Nein gewählt:
  4233.       GOTO raus_block_loeschen  ! raus
  4234.     ENDIF                       ! d
  4235.     @a_undostueck               ! Stück vorsichtshalber in Undoarray kopieren
  4236.   ENDIF                         ! d
  4237.   ' ............................................................................
  4238.   IF g_bla%=1 AND g_ble%=g_mn%  ! F ganzes Stück gelöscht werden soll:
  4239.     SPUT g_lb$                  ! Bild von Noten reinigen (Löschbild)
  4240.     LET g_n%=1                  ! Endschreibmodus ein, zusammen mit:
  4241.     LET g_mn%=0                 ! Endschreibmodus ein
  4242.     PUT g_x%(g_n%),g_y%(g_n%),g_cs$,9   ! Cusor ein
  4243.     LET g_bla%=0                ! Blockanfang löschen
  4244.     LET g_ble%=0                ! Blockende löschen
  4245.     GOTO raus_block_loeschen    ! raus
  4246.   ELSE IF g_bla%=0 OR g_ble%=0  ! F Blockanfang oder - ende nicht gesetzt:
  4247.     GOTO raus_block_loeschen    ! raus
  4248.   ENDIF                         ! d
  4249.   ' ............................................................................
  4250.   '                             ! den ganzen Block durch einschl. Blockgrenzen:
  4251.   LET n%=g_ble%                 ! Hinten am Blockende (einschl.) anfangen
  4252.   REPEAT                        ! 'FOR n%=g_ble% DOWNTO g_bla%' - Ersatzschleife
  4253.     '    PRINT AT(1,1);"Bl.anf.:'";g_bla%;"' Bl.end.:'";g_ble%;"' nächste Löschnote: g_n$(";n%;")='";g_n$(n%);"' g_mn%='";g_mn%;"'  "
  4254.     DELETE g_n$(n%)             ! Note innerhalb des Blocks löschen
  4255.     DEC n%                      ! nächste Note innerhalb des Blocks
  4256.   UNTIL n%=g_bla%-1             ! Raus, f Blockanfang einschließlich gekillt
  4257.   ' ............................................................................
  4258.   LET bl_l%=g_ble%-g_bla%+1     ! Blocklänge in Noten (einschl. Blockgrenzen)
  4259.   LET g_mn%=g_mn%-bl_l%         ! Neue Endnotennummer festsetzen
  4260.   SPUT g_lb$                    ! Bild von Noten reinigen (Löschbild)
  4261.   @2_stueck_ganz_zeigen         ! Geladenes Stück auf Bildschirm
  4262.   LET g_n%=g_mn%                ! Notencursor auf Stückende: erst hier,
  4263.   '                             ! da in 'geladenes_stueck' for-Schleife
  4264.   IF g_n%=0                     ! F Keine Note mehr vorhanden (auch g_mn%=0)
  4265.     LET g_n%=1                  ! Endschreibmodus ein
  4266.   ENDIF                         ! d
  4267.   PUT g_x%(g_n%),g_y%(g_n%),g_cs$,9   ! Cusor ein
  4268.   LET g_bla%=0                  ! Blockanfang löschen
  4269.   LET g_ble%=0                  ! Blockende löschen
  4270.   ' ............................................................................
  4271.   raus_block_loeschen:          ! d
  4272.   ' ----------------------------------------------------------------------------
  4273. RETURN
  4274. > PROCEDURE 3_bl_faehnchen(v!)    !_:
  4275.   ' ----------------------------------------------------------------------------
  4276.   ' Ein Fähnchen wird der aktuellen Note hinzugefügt oder weggennommen, was
  4277.   ' im 1. Teil festgestellt wird. Danach werden im 2. Teil die Ober-
  4278.   ' und Untergrenzen der Fähnchenanzahl einzelner Noten im Block ermittelt.
  4279.   ' Falls mehr oder weniger Fähnchen gewünscht werden, als vom Programm her
  4280.   ' überhaupt möglich, wird im 3. Teil zum Prozedurende verzweigt. Im 4. Teil
  4281.   ' wird dann die Note wie gewünscht verändert und im 5. Teil neu dargestellt.
  4282.   ' ----------------------------------------------------------------------------
  4283.   ' v!                              ! =-1 für: ein Fähnchen weniger
  4284.   LOCAL b|                          ! Fähnchenanzahl irgendeiner Note im Block
  4285.   LOCAL max_b|                      ! maximale Fähnchenanzahl im Block
  4286.   LOCAL min_b|                      ! minimale Fähnchenanzahl im Block
  4287.   LOCAL n%                          ! Notennrzähler für Blockschleife
  4288.   LOCAL f%                          ! Fähnchendiff. ganzzahlig
  4289.   ' ............................................................................
  4290.   PUT g_x%(g_n%),g_y%(g_n%),g_cs$,9 ! Cusor aus
  4291.   ' ............................................................................
  4292.   ' 1. Gewühnschte Fähnchenanzahldifferenz ermitteln:
  4293.   ' ............................................................................
  4294.   IF v!=-1                          ! F ein Fähnchen weniger verlangt
  4295.     LET f%=-1                       ! Differenz = -1
  4296.   ELSE                              ! F ein Fähnchen mehr verlangt
  4297.     LET f%=1                        ! Differenz = +1
  4298.   ENDIF                             ! d
  4299.   ' ............................................................................
  4300.   ' 2. Minimale und maximale Fähnchenanzahl im Block ermitteln:
  4301.   ' ............................................................................
  4302.   LET min_b|=3                      ! Minimum = höchstmögliche Fähnchenanzahl
  4303.   FOR n%=g_bla% TO g_ble%           ! den ganzen Block einschl. Grenzen durch:
  4304.     LET b|=VAL(MID$(g_n$(n%),2,1))  ! Periode der aktuellen Blocknote
  4305.     IF b|>max_b|                    ! F akt. Fähnchenanz.>max.Fähnchenanz.
  4306.       LET max_b|=b|                 ! maximale Fähnchenanz. neu setzen
  4307.     ENDIF                           ! d
  4308.     IF b|<min_b|                    ! F akt. Fähnchenanz.<min.Fähnchenanz.
  4309.       LET min_b|=b|                 ! minimale Fähnchenanz. neu setzen
  4310.     ENDIF                           ! d
  4311.   NEXT n%                           ! nächste Note innerhalb des Blocks
  4312.   ' ............................................................................
  4313.   ' 3.) Raus, falls gewünschte Periodendauer > 1/4 oder < 1/32 sein soll:
  4314.   ' ............................................................................
  4315.   IF min_b|+f%<0                  ! F weniger als null Fähnchen gewünscht:
  4316.     PRINT AT(1,1);"zu lang!"      ! Fehlermeldung
  4317.     PAUSE 40                      ! Zeit zum Lesen
  4318.     GOTO raus_bl_faehnchen        ! d
  4319.   ENDIF                           ! d
  4320.   IF max_b|+f%>3                  ! F mehr als vier Fähnchen gewünscht:
  4321.     PRINT AT(1,1);"zu kurz!"      ! Fehlermeldung
  4322.     PAUSE 40                      ! Zeit zum Lesen
  4323.     GOTO raus_bl_faehnchen        ! d
  4324.   ENDIF                           ! d
  4325.   ' ............................................................................
  4326.   ' 4.) Fähnchenveränderschleife
  4327.   ' ............................................................................
  4328.   FOR n%=g_bla% TO g_ble%           ! den ganzen Block einschl. Grenzen durch:
  4329.     LET b|=VAL(MID$(g_n$(n%),2,1))  ! Periode der aktuellen Blocknote
  4330.     MID$(g_n$(n%),2,1)=STR$(b|+f%)  ! Änderung abspeichern
  4331.   NEXT n%                           ! nächste Note innerhalb des Blocks
  4332.   ' ............................................................................
  4333.   ' 5.) Geänderten Text darstellen und Blockmarken löschen:
  4334.   ' ............................................................................
  4335.   SPUT g_lb$                        ! Bild von Noten reinigen (Löschbild)
  4336.   @2_stueck_ganz_zeigen             ! Geladenes Stück auf Bildschirm
  4337.   LET g_bla%=0                      ! Blockanfang löschen
  4338.   LET g_ble%=0                      ! Blockende löschen
  4339.   ' ............................................................................
  4340.   raus_bl_faehnchen:                ! d
  4341.   PUT g_x%(g_n%),g_y%(g_n%),g_cs$,9 ! Cusor ein
  4342.   PUT 0,0,g_kl$                     ! Klaviatur von Infotext reinigen
  4343.   ' ----------------------------------------------------------------------------
  4344. RETURN
  4345. > PROCEDURE 3_bl_transponieren    !_:
  4346.   ' ----------------------------------------------------------------------------
  4347.   ' Im 1. Teil wird die neue, gewünschte Starthöhe und die alte Starthöhe im
  4348.   ' Blockanfang festgestellt. Im 2. Teil werden die Ober- und Untergrenzen
  4349.   ' der Tonhöhen innerhalb des Blockbereichs ermittelt. Falls beim gewünschten
  4350.   ' Transponieren der Tonumfang des Programms gesprengt werden würde, wird
  4351.   ' im 3. Teil dann zum Prozedurende verzweigt. Im 4. Teil wird dann trans-
  4352.   ' poniert, im 5. Teil das Ergebnis dargestellt.
  4353.   ' ----------------------------------------------------------------------------
  4354.   LOCAL a|                          ! Tonhöhe irgendeiner Note im Block
  4355.   LOCAL max_a|                      ! maximale Tonhöhe im Block
  4356.   LOCAL min_a|                      ! minimale Tonhöhe im Block
  4357.   LOCAL neu_sh|                     ! neue Starttonöhe
  4358.   LOCAL blk_sh|                     ! Starttonhöhe im Block
  4359.   LOCAL n%                          ! Notennrzähler für Blockschleife
  4360.   LOCAL diff|                       ! Transponierdiff. natürlich
  4361.   LOCAL diff%                       ! Transponierdiff. ganzzahlig
  4362.   LOCAL kl$                         ! Klaviaturnegativ
  4363.   ' ............................................................................
  4364.   GET 0,0,g_bb%-1,g_mh|-1,kl$       ! Klaviatur mit Hauptmenütext fotografieren
  4365.   PUT 0,0,g_kl$                     ! Klaviatur ohne Hauptmenütext raus
  4366.   PRINT AT(1,1);"Neue Anfangsnote eingeben!" ! d
  4367.   PUT g_x%(g_n%),g_y%(g_n%),g_cs$,9 ! Cusor aus
  4368.   IF g_bla%=0 OR g_ble%=0           ! F Blockanfang oder - ende nicht gesetzt:
  4369.     GOTO raus_bl_transponieren      ! raus
  4370.   ENDIF                             ! d
  4371.   ' ............................................................................
  4372.   ' 0.) Auf neue Eingabe warten
  4373.   ' ............................................................................
  4374.   REPEAT                            ! Warteschleife für Mausklick
  4375.   UNTIL MOUSEK                      ! Raus f Mausklick
  4376.   PUT 0,0,g_kl$                     ! Klaviatur ohne Hauptmenütext raus
  4377.   LET x%=MOUSEX                     ! x-Koordinate festhalten
  4378.   IF MOUSEY>g_mh|                   ! F Maus auf Klaviatur
  4379.     GOTO raus_bl_transponieren      ! d
  4380.   ENDIF                             ! d
  4381.   ' ............................................................................
  4382.   ' 1.) Neue Starttonhöhe neu_h| für den Blockbereich feststellen
  4383.   ' ............................................................................
  4384.   IF x%<g_ptb| OR x%>g_bb%-g_ptb|   ! Pausentaste ?
  4385.     PRINT AT(1,1);"zu pausig!"      ! Fehlermeldung
  4386.     PRINT CHR$(7);                  ! Gong !
  4387.     PAUSE 40                        ! Zeit zum Lesen
  4388.     GOTO raus_bl_transponieren      ! d
  4389.   ELSE                              ! Notentaste:
  4390.     LET neu_sh|=TRUNC((x%-g_ptb|)/g_ntb|)+1! Neue Starttonhöe feststellen
  4391.   ENDIF                             ! d
  4392.   LET blk_sh|=ASC(LEFT$(g_n$(g_bla%),1))-64 ! Alte Starttonhöhe vom Blockanf.
  4393.   ' ............................................................................
  4394.   ' 2.) Maximale & min. Tonhöhe (max_a| & min_a|) im Blockbereich feststellen:
  4395.   ' ............................................................................
  4396.   LET min_a|=25                     ! Minimum = höchstmögliche Notenhöhe
  4397.   FOR n%=g_bla% TO g_ble%           ! den ganzen Block einschl. Grenzen durch:
  4398.     LET a|=ASC(LEFT$(g_n$(n%),1))-64! Tonhöhe der aktuellen Blocknote
  4399.     IF a|>max_a| AND NOT a|=26      ! F akt. Tonhöhe(=|=Pause) >maximale Tonhöhe
  4400.       LET max_a|=a|                 ! maximale Tonhöhe neu setzen
  4401.     ENDIF                           ! d
  4402.     IF a|<min_a|                    ! F akt. Tonhöhe < minimale Tonhöhe
  4403.       LET min_a|=a|                 ! minimale Tonhöhe neu setzen
  4404.     ENDIF                           ! d
  4405.   NEXT n%                           ! nächste Note innerhalb des Blocks
  4406.   ' ............................................................................
  4407.   ' 3.) Raus, falls Transponierdifferenz für Tonumfang (c1-c3) zu groß:
  4408.   ' ............................................................................
  4409.   IF neu_sh|<blk_sh|                ! F nach unten transponiert werden soll:
  4410.     LET diff|=blk_sh|-neu_sh|       ! Differenz der Starthöhen=Transponierdiff.
  4411.     IF min_a|-diff|<1               ! F minimale Tonhöhe unter c1 tr.würde
  4412.       PRINT AT(1,1);"zu tief!"      ! Fehlermeldung
  4413.       PRINT CHR$(7);                ! Gong !
  4414.       PAUSE 40                      ! Zeit zum Lesen
  4415.       GOTO raus_bl_transponieren    ! d
  4416.     ENDIF                           ! d
  4417.     LET diff%=(-1)*diff|            ! Zukünftige Transponierdiff. ganzzahlig
  4418.   ELSE IF neu_sh|>blk_sh|           ! F nach oben transponiert werden soll
  4419.     LET diff|=neu_sh|-blk_sh|       ! Differenz der Starthöhen=Transponierdiff.
  4420.     IF max_a|+diff|>25              ! F maximale Tonhöhe über c3 tr.würde
  4421.       PRINT AT(1,1);"zu hoch!"      ! Fehlermeldung
  4422.       PRINT CHR$(7);                ! Gong !
  4423.       PAUSE 40                      ! Zeit zum Lesen
  4424.       GOTO raus_bl_transponieren    ! d
  4425.     ENDIF                           ! d
  4426.     LET diff%=diff|                 ! Zukünftige Transponierdiff. ganzzahlig
  4427.   ELSE                              ! sonst:
  4428.     PRINT AT(1,1);"zu gleich!"      ! Fehlermeldung
  4429.     PRINT CHR$(7);                  ! Gong !
  4430.     PAUSE 40                        ! Zeit zum Lesen
  4431.     GOTO raus_bl_transponieren      ! d
  4432.   ENDIF                             ! EFU nach oben / unten transponieren
  4433.   ' ............................................................................
  4434.   ' 4.) Transponierschleife
  4435.   ' ............................................................................
  4436.   FOR n%=g_bla% TO g_ble%           ! den ganzen Block einschl. Grenzen durch:
  4437.     LET a|=ASC(LEFT$(g_n$(n%),1))-64! Tonhöhe der aktuellen Blocknote
  4438.     IF a|<>26                       ! F Note keine Pause:
  4439.       MID$(g_n$(n%),1,1)=CHR$(a|+diff%+64)  ! Änderung abspeichern
  4440.     ENDIF                           ! d
  4441.   NEXT n%                           ! nächste Note innerhalb des Blocks
  4442.   ' ............................................................................
  4443.   ' 5.) Geänderten Text darstellen und Blockmarken löschen:
  4444.   ' ............................................................................
  4445.   SPUT g_lb$                        ! Bild von Noten reinigen (Löschbild)
  4446.   @2_stueck_ganz_zeigen             ! Geladenes Stück auf Bildschirm
  4447.   LET g_bla%=0                      ! Blockanfang löschen
  4448.   LET g_ble%=0                      ! Blockende löschen
  4449.   LET g_n%=g_mn%                    ! Cursor auf letzte Note
  4450.   ' ............................................................................
  4451.   raus_bl_transponieren:            ! d
  4452.   PUT 0,0,kl$                       ! Klaviatur mit Hauptmenütext raus
  4453.   PUT g_x%(g_n%),g_y%(g_n%),g_cs$,9 ! Cusor ein
  4454.   PUT 0,0,g_kl$                     ! Klaviatur von Infotext reinigen
  4455.   ' ----------------------------------------------------------------------------
  4456. RETURN
  4457. ' ------------------------------------------------------------------------------
  4458. > PROCEDURE 1_abspielgeschw       !_:
  4459.   ' ----------------------------------------------------------------------------
  4460.   LOCAL a                       ! Abspielgeschwindigkeitsfaktor
  4461.   LOCAL bld$                    ! Bildschirmnegativ
  4462.   ' ............................................................................
  4463.   SGET bld$                     ! Bildschirm retten
  4464.   PUT 0,0,g_kl$                 ! Klaviatur ohne Hauptmenütext raus
  4465.   nochmal_abspielgeschw:        ! d
  4466.   PRINT AT(1,1);"bisher:";g_vz|/8;", 1=ganz schnell, 6=ganz langsam, neu: ";
  4467.   INPUT a                       ! Eingabe
  4468.   IF a<1 OR a>6                 ! F Frequenz außerhalb erlaubtem Intervall:
  4469.     PUT 0,0,g_kl$               ! Klaviatur ohne Hauptmenütext raus
  4470.     PRINT AT(1,1);"zu extrem!"  ! Fehlermeldung
  4471.     PRINT CHR$(7);              ! Gong !
  4472.     PAUSE 40                    ! Zeit zum Lesen
  4473.     GOTO nochmal_abspielgeschw  ! d
  4474.   ENDIF                         ! d
  4475.   LET g_vz|=8*a                 ! siehe auch '0_globalvariablen'
  4476.   SPUT bld$                     ! Bildschirm wiederherstellen
  4477.   ' ----------------------------------------------------------------------------
  4478. RETURN
  4479. > PROCEDURE 1_stueckpause         !_:
  4480.   ' ----------------------------------------------------------------------------
  4481.   LOCAL a1                      ! Neue Frequenz für a1
  4482.   LOCAL d                       ! Differenz neue und alte Frequenz von a1
  4483.   LOCAL bld$                    ! Bildschirmnegativ
  4484.   ' ............................................................................
  4485.   SGET bld$                     ! Bildschirm retten
  4486.   PUT 0,0,g_kl$                 ! Klaviatur ohne Hauptmenütext raus
  4487.   nochmal_stueckpause:          ! d
  4488.   PRINT AT(1,1);"bisher Stückpause: ";g_sp%;" /50-tel Sek., Neue Stückpause: ";
  4489.   INPUT a1                      ! Eingabe
  4490.   IF a1<0 OR a1>100             ! F Pause außerhalb erlaubtem Intervall:
  4491.     PUT 0,0,g_kl$               ! Klaviatur ohne Hauptmenütext raus
  4492.     PRINT AT(1,1);"zu extrem!"  ! Fehlermeldung
  4493.     PRINT CHR$(7);              ! Gong !
  4494.     PAUSE 40                    ! Zeit zum Lesen
  4495.     GOTO nochmal_stueckpause    ! d
  4496.   ENDIF                         ! d
  4497.   LET g_sp%=a1                  ! Stückpause an Globalvariable übergeben
  4498.   SPUT bld$                     ! Bildschirm wiederherstellen
  4499.   ' ----------------------------------------------------------------------------
  4500. RETURN
  4501. > PROCEDURE 1_tonhoehe            !_:
  4502.   ' ----------------------------------------------------------------------------
  4503.   ' Funktionslos, seit 4 Oktaven möglich, siehe auch Prozedur 'a_2s'
  4504.   ' ----------------------------------------------------------------------------
  4505.   LOCAL a1                      ! Neue Frequenz für a1
  4506.   LOCAL d                       ! Differenz neue und alte Frequenz von a1
  4507.   LOCAL bld$                    ! Bildschirmnegativ
  4508.   ' ............................................................................
  4509.   SGET bld$                     ! Bildschirm retten
  4510.   PUT 0,0,g_kl$                 ! Klaviatur ohne Hauptmenütext raus
  4511.   nochmal_tonhoehe:             ! d
  4512.   PRINT AT(1,1);"a1 hat bisher die Frequenz: ";fr%(10);", Neue Frequenz für a1: ";
  4513.   INPUT a1                      ! Eingabe
  4514.   IF a1<100 OR a1>10000         ! F Frequenz außerhalb erlaubtem Intervall:
  4515.     PUT 0,0,g_kl$               ! Klaviatur ohne Hauptmenütext raus
  4516.     PRINT AT(1,1);"zu extrem!"  ! Fehlermeldung
  4517.     PRINT CHR$(7);              ! Gong !
  4518.     PAUSE 40                    ! Zeit zum Lesen
  4519.     GOTO nochmal_tonhoehe       ! d
  4520.   ENDIF                         ! d
  4521.   SPUT bld$                     ! Bildschirm wiederherstellen
  4522.   LET d=a1-fr%(10)              ! Differenz: neue Frequenz/ alte Frequenz von a1
  4523.   FOR i|=1 TO 50                ! Alle Frequenzdaten durch
  4524.     LET fr%(i|)=fr%(i|)+d       ! neue Frequenzen berechnen
  4525.   NEXT i|                       ! nächste Note im Frequenzarray
  4526.   ' ----------------------------------------------------------------------------
  4527. RETURN
  4528. > PROCEDURE 1_midi_ein_aus        !_:
  4529.   ' ----------------------------------------------------------------------------
  4530.   IF g_midi!=FALSE                      ! F bisher aus:
  4531.     LET g_midi!=TRUE                    ! Midi ein
  4532.   ELSE                                  ! sonst
  4533.     LET g_midi!=FALSE                   ! Midi aus
  4534.   ENDIF                                 ! d
  4535.   ' ----------------------------------------------------------------------------
  4536. RETURN
  4537. ' ------------------------------------------------------------------------------
  4538. > PROCEDURE 1_programmende(w|)    !_:
  4539.   ' ----------------------------------------------------------------------------
  4540.   LOCAL m|                      ! Menüwahlvariable
  4541.   ' w|                          ! Wahlvariable
  4542.   ' ............................................................................
  4543.   IF w|=1                       ! Edit gewählt:  (Bei PD-Version draußen !)
  4544.     EDIT                        ! d
  4545.   ELSE IF w|=2                  ! w|=2, Quit gewählt:
  4546.     @a_alert("Wirklich Interpreter verlassen?/Ja|Nein",m|)
  4547.     IF m|=1                     ! F 'ja' gewählt:
  4548.       QUIT                      ! d
  4549.     ENDIF                       ! d
  4550.   ENDIF                         ! d
  4551.   ' ----------------------------------------------------------------------------
  4552. RETURN
  4553. ' ##############################################################################
  4554. '  A l e r t b o x p r o z e d u r e n :
  4555. ' ##############################################################################
  4556. > PROCEDURE a_alert(a1$,VAR w1|)
  4557.   t0t|=21
  4558.   ' ----------------------------------------------------------------------------
  4559.   ' Diese Prozedur entspricht einer Gem-Alertbox, es sind aber viel mehr
  4560.   ' Einträge möglich.
  4561.   ' Ein Alertübergabestring (Bsp.: "Hallo|Du ! Bist Du's ?/Ja|Nein") besteht
  4562.   ' aus einem Teil der nur angezeigt wird (der steht vor dem '/') und einem
  4563.   ' Teil, bei dem man aus den verschiedenen Einträgen auswählen kann (der
  4564.   ' steht hinter dem '/'). Beide Teile zusammen dürfen höchstens 20 Einträge
  4565.   ' haben, die höchstens 78 Zeichen breit sind
  4566.   ' ----------------------------------------------------------------------------
  4567.   LOCAL i1%                 ! Zähler für Analyse des Menüeintragsstrings
  4568.   LOCAL i1|                 ! Zähler für Analyse des Menüeintragsstrings
  4569.   LOCAL j1|                 ! Zähler für Menüeintrage (erst nicht,dann whlb)
  4570.   LOCAL l1|                 ! Längenmaximum aller Einträge
  4571.   LOCAL mxb1|               ! Maximum der nur anzuzeigenden Menüeinträge
  4572.   LOCAL mxw1|               ! Maximum der wählbaren Menüeinträge
  4573.   LOCAL bld1$               ! Bildspeicher
  4574.   LOCAL sx1|                ! Start-x-Spalte der Einträge
  4575.   LOCAL sy1|                ! Start-y-Zeile  der Einträge
  4576.   ' ............................................................................
  4577.   FOR i1%=1 TO LEN(a1$)         ! String durch
  4578.     IF MID$(a1$,i1%,1)="|"      ! Grenze errcht
  4579.       INC j1|                   ! Zählr erhöh.
  4580.     ENDIF                       ! d
  4581.     IF MID$(a1$,i1%,1)="/"      ! Grenze errcht
  4582.       LET mxb1|=j1|+1           ! Mx nur Bild
  4583.       CLR j1|                   ! Zähler null
  4584.     ENDIF                       ! d
  4585.   NEXT i1%                      ! nächst Buchst
  4586.   LET mxw1|=j1|+1               ! Mx wählbar
  4587.   ' ............................................................................
  4588.   DIM b1$(mxb1|)        ! Array für Menü mit nur angezeigten Eintägen
  4589.   DIM w1$(mxw1|)        ! Array für Menü mit wählbaren Eintägen
  4590.   ' ............................................................................
  4591.   ' Jetzt werden erst 'mal die Nurbildeinträge ausgefiltert
  4592.   LET j1|=1                                 ! Eintragszähler 1
  4593.   FOR i1|=1 TO LEN(a1$)                     ! aString durch
  4594.     LET mi1$=MID$(a1$,i1|,1)                ! akt. Zchn merken
  4595.     IF mi1$="|" OR mi1$="/"                 ! Eintragsgrenze errcht
  4596.       LET b1$(j1|)=LEFT$(a1$,i1|-1)         ! Nurbildeintrag setzen
  4597.       IF l1|<LEN(b1$(j1|))                  ! F neues Längenmaximum
  4598.         LET l1|=LEN(b1$(j1|))               ! übernehmen
  4599.       ENDIF                                 ! d
  4600.       LET a1$=RIGHT$(a1$,LEN(a1$)-i1|)      ! aString kürzen
  4601.       CLR i1|                               ! Zeichenzähler null
  4602.       INC j1|                               ! Eintragszählr erhöh.
  4603.     ENDIF                                   ! d
  4604.     EXIT IF mi1$="/"                        ! Menügrenze errcht
  4605.   NEXT i1|                                  ! nächst Buchst
  4606.   LET a1$=RIGHT$(a1$,LEN(a1$)-i1|)          ! aString kürzen
  4607.   ' ............................................................................
  4608.   ' Jetzt werden die Wahleinträge ausgefiltert
  4609.   LET j1|=1                                 ! Eintragszähler 1
  4610.   REPEAT                                    ! aString durch
  4611.     INC i1|                                 ! nächste Zeichennummer
  4612.     LET mi1$=MID$(a1$,i1|,1)                ! akt. Zchn merken
  4613.     IF mi1$="|" OR mi1$="/"                 ! Eintragsgrenze errcht
  4614.       LET w1$(j1|)=LEFT$(a1$,i1|-1)         ! Wahleintrag setzen
  4615.       IF l1|<LEN(w1$(j1|))                  ! F neues Längenmaximum
  4616.         LET l1|=LEN(w1$(j1|))               ! übernehmen
  4617.       ENDIF                                 ! d
  4618.       LET a1$=RIGHT$(a1$,LEN(a1$)-i1|)      ! aString kürzen
  4619.       CLR i1|                               ! Zeichenzähler null
  4620.       INC j1|                               ! Eintragszählr erhöh.
  4621.     ENDIF                                   ! d
  4622.   UNTIL i1|=LEN(a1$)                        ! aString ganz durch
  4623.   LET w1$(j1|)=a1$                          ! Wahleintrag setzen
  4624.   ' ............................................................................
  4625.   IF b1$(1)<>""                             ! d
  4626.     LET b1$(1)=LEFT$(b1$(1)+SPACE$(l1|),l1|)! Mit Spaces auffüllen
  4627.   ENDIF                                     ! d
  4628.   IF w1$(1)<>""                             ! d
  4629.     LET w1$(1)=LEFT$(w1$(1)+SPACE$(l1|),l1|)! Mit Spaces auffüllen
  4630.   ENDIF                                     ! d
  4631.   ' ............................................................................
  4632.   LET sx1|=ROUND((80-l1|)/2)                ! Startspalte
  4633.   LET sy1|=ROUND((22-mxb1|)/2)              ! Startzeile
  4634.   ' ............................................................................
  4635.   ' Alertausschnitt (Kasten, der der Alertbox entspricht) ausschneiden, retten:
  4636.   GET (sx1|-1)*8-1,(sy1|-1)*16,sx1|*8+l1|*8,sy1|*16+(mxb1|+mxw1|)*16,bld1$
  4637.   ' ............................................................................
  4638.   @a_menue(-1,0,0,0,0,-1,sx1|,sy1|,1,mxb1|,dummy1|,dummy1|,b1$(),d!())
  4639.   REPEAT                                    ! Solange neues Menü,
  4640.     @a_menue(-1,-1,-1,0,0,-1,sx1|,sy1|+mxb1|,1,mxw1|,dummy1|,w1|,w1$(),d!())
  4641.   UNTIL w1|<>0                              ! bis Eintrag gewählt
  4642.   ' ............................................................................
  4643.   PUT (sx1|-1)*8-1,(sy1|-1)*16,bld1$        ! Alertausschnitt zurück
  4644.   ' ............................................................................
  4645.   ERASE b1$()       ! Array für Menü mit nur angezeigten Eintägen
  4646.   ERASE w1$()       ! Array für Menü mit wählbaren Eintägen
  4647.   ' ----------------------------------------------------------------------------
  4648. RETURN
  4649. > PROCEDURE a_menue(ad!,wv!,we1!,wex!,inp!,rmn!,sx|,sy|,sp|,zl|,VAR m|,w|,a$(),a!())
  4650.   t0t|=22
  4651.   ' ----------------------------------------------------------------------------
  4652.   ' Mit dieser Prozedur kann man ein Menü erzeugen. Dessen Einträge müssen
  4653.   ' sich im Übergabearray a$() befinden. Welcher Eintrag gewählt wurde,
  4654.   ' erfährt man nach Prozedurende im Rückgabeparametzer w|. Es gibt
  4655.   ' einige Zusätzliche Einstellungen, die im folgenden aufgelistet sind:
  4656.   ' ----------------------------------------------------------------------------
  4657.   '
  4658.   ' Übergabevariablen:
  4659.   '
  4660.   ' ad!  = Auch Darstellung des Menüs ? nein=0, ja=-1
  4661.   ' wv!  = Wahlvorschlag (1.Eintrag) ein (-1) oder aus (0)
  4662.   ' we1! = wählbare Einträge(nur 1) (-1) oder nicht (0: also Menü nur abbilden)
  4663.   ' wex! = alle (insbes. mehr als ein Eintrag) Einträge wählbar ? ja=-1, nein=0
  4664.   ' inp! = Input (-1:schließt bis jetzt wex!=-1 aus!) oder nicht (0)
  4665.   ' rmn! = Rahmen (-1) oder nicht (0)
  4666.   ' sx|  = Start-x-Koordinate (in Zeichen) von Menüeinträgen links
  4667.   ' sy|  = Start-y-Koordinate (in Zeichen) von Menüeinträgen oben
  4668.   ' sp|  = Spaltenanzahl der Menüeinträge
  4669.   ' zl|  = Zeilenanzahl der Menüeinträge
  4670.   ' m|   = Maustastennummer 0=linke, 1=rechte Maustaste
  4671.   ' w|   = Wahlnummer des gewählten Eintrages            auch zurück !
  4672.   ' a$() = Eintragsarray, hier sind alle Einträge drin   auch zurück !
  4673.   ' a!() = Wahlarray hier steht an erster Stelle eine 0, falls der entsprechende
  4674.   '        Eintrag in a$() nicht gewählt und -1, falls er gewählt.
  4675.   '
  4676.   ' ............................................................................
  4677.   LOCAL di|        ! Die Anzahl der Spaces, die wegen der Inputfunktion
  4678.   '                ! jedem Eintrag hinten drangefügt werden (in letzter
  4679.   '                ! Procedure wieder abgezogen)
  4680.   LOCAL ml|        ! Eintragslängenmaximum
  4681.   ' ............................................................................
  4682.   REPEAT            ! Warteschleife für Mauseingabe:
  4683.   UNTIL MOUSEK=0    ! Erst Raus,wenn Maus nix mehr meldet,also Puffer leer
  4684.   ' ............................................................................
  4685.   @a_menueeintraege_maximieren(sp|,zl|,ml|,di|,a$())    ! d
  4686.   IF rmn!=-1                                            ! Mit Rahmen
  4687.     @a_menuerahmen(ml|,sx|,sy|,sp|,zl|)                 ! d
  4688.   ENDIF                                                 ! d
  4689.   IF we1!=0 AND ad!                                     ! Menü nur anzgen
  4690.     @a_menue_anzeigen(ml|,sx|,sy|,sp|,zl|,a$())         ! d
  4691.   ELSE IF inp!=0                                        ! Wählen oh.Input
  4692.     IF ad!                                              ! f auch darstellen
  4693.       @a_menue_anzeigen(ml|,sx|,sy|,sp|,zl|,a$())       ! d
  4694.     ENDIF                                               ! d
  4695.     IF wex!                                             ! F alle Einträge wählb.
  4696.       @a_eintraege_waehlen(wv!,ml|,sx|,sy|,sp|,zl|,a$(),a!(),m|,w|) ! d
  4697.     ELSE                                                ! F nur 1 Eintrag wählb.
  4698.       @a_eintrag_waehlen(wv!,ml|,sx|,sy|,sp|,zl|,a$(),m|,w|) ! d
  4699.     ENDIF                                               ! d
  4700.   ELSE                                                  ! Wähln mit Input
  4701.     IF ad!                                              ! f auch darstellen
  4702.       @a_menue_anzeigen(ml|,sx|,sy|,sp|,zl|,a$())       ! d
  4703.     ENDIF                                               ! d
  4704.     @a_eintrag_waehlen(wv!,ml|,sx|,sy|,sp|,zl|,a$(),m|,w|) ! d
  4705.     IF w|<>0                                            ! F Eintrag gew.
  4706.       @a_eintraginput(ml|,di|,sx|,sy|,sp|,zl|,m|,w|,a$())  ! d
  4707.       IF a$(w|)="        "                              ! F nix eingeg.
  4708.         LET w|=0                                        ! Abbruchcode
  4709.       ENDIF                                             ! d
  4710.     ENDIF                                               ! d
  4711.   ENDIF                                                 ! d
  4712.   @a_menueeintraege_minus_di8(sp|,zl|,ml|,di|,a$())     ! Inputzusatz wiederweg
  4713.   ' ----------------------------------------------------------------------------
  4714. RETURN
  4715. > PROCEDURE a_menueeintraege_maximieren(sp3|,zl3|,VAR ml3|,di3|,a3$())
  4716.   t2t|=23
  4717.   ' ----------------------------------------------------------------------------
  4718.   ' Hier werden alle Einträge mit Spaces aufgefüllt, bis sie alle gleich
  4719.   ' lang sind.
  4720.   ' ----------------------------------------------------------------------------
  4721.   '     di3|                        ! Zusätzliche Spaces am Ende jedes
  4722.   '                                 ! Eintrages, um nachher korrektes
  4723.   '                                 ! Input zu ermöglichen
  4724.   '                                 ! Diese Variable ist Rückgabeparameter
  4725.   '     ml3|                        ! Eintragslängenmaximum ist "
  4726.   ' ............................................................................
  4727.   LOCAL i3|                         ! Zähler für Einträge
  4728.   ' ............................................................................
  4729.   LET di3|=1                        ! Für Input zusätliche di3| Spaces
  4730.   LET ml3|=0                        ! Eintragslängenmaximum null setzen
  4731.   ' ............................................................................
  4732.   FOR i3|=1 TO sp3|*zl3|            ! Alle Einträge durch
  4733.     IF LEN(a3$(i3|))>ml3|           ! Falls Eintrag größer als bisher
  4734.       LET ml3|=LEN(a3$(i3|))        ! Maximum Eintraglänge neu setzen
  4735.     ENDIF                           ! d
  4736.   NEXT i3|                          ! nächster Eintrag
  4737.   ' ............................................................................
  4738.   FOR i3|=1 TO sp3|*zl3|                      !Alledurch
  4739.     a3$(i3|)=LEFT$(a3$(i3|)+SPACE$(ml3|),ml3|)!Auffüllen
  4740.     a3$(i3|)=a3$(i3|)+SPACE$(di3|)            !für Input
  4741.   NEXT i3|                                    ! nächster
  4742.   ' ............................................................................
  4743.   ADD ml3|,di3|                               ! Eintragslänge anpassen
  4744.   ' ----------------------------------------------------------------------------
  4745. RETURN
  4746. > PROCEDURE a_menuerahmen(ml4|,sx4|,sy4|,sp4|,zl4|)
  4747.   t2t|=24
  4748.   ' ----------------------------------------------------------------------------
  4749.   ' In dieser Prozedur erhält das kommende Menü einen Rahmen.
  4750.   ' ----------------------------------------------------------------------------
  4751.   LOCAL dx4|        ! Distanz zwischen Rahmen und Eintragsrand in x-Richtung
  4752.   LOCAL dy4|        ! Distanz zwischen Rahmen und Eintragsrand in y-Richtung
  4753.   LOCAL lx4%        ! Position des Rahmens links
  4754.   LOCAL oy4%        ! Position des Rahmens oben
  4755.   LOCAL rx4%        ! Position des Rahmens rechts
  4756.   LOCAL uy4%        ! Position des Rahmens unten
  4757.   ' ............................................................................
  4758.   LET dx4|=1                                        ! Randabstand x
  4759.   LET dy4|=1                                        ! Randabstand y
  4760.   LET lx4%=(sx4|-1)*8-dx4|                          ! Links
  4761.   LET oy4%=sy4|*16-dy4|                             ! Oben
  4762.   LET rx4%=lx4%+ml4|*sp4|*8+dx4|                    ! Rechts
  4763.   LET uy4%=oy4%+zl4|*16+dy4|                        ! Unten
  4764.   ' ............................................................................
  4765.   BOX lx4%,oy4%,rx4%,uy4%                           ! Rahmen Zeichnen
  4766.   ' ----------------------------------------------------------------------------
  4767. RETURN
  4768. > PROCEDURE a_menue_anzeigen(ml5|,sx5|,sy5|,sp5|,zl5|,VAR a5$())
  4769.   t2t|=25
  4770.   ' ----------------------------------------------------------------------------
  4771.   ' In dieser Prozedur wird das Menü erst einmal nur angezeigt. Wählen kann
  4772.   ' man hier also noch nicht.
  4773.   ' ----------------------------------------------------------------------------
  4774.   LOCAL i5|         ! Spaltenzähler für Eintragsspalten
  4775.   LOCAL j5|         ! Zeilenzähler  für Eintragsszeilen
  4776.   LOCAL k5|         ! Eintragszähler
  4777.   ' ............................................................................
  4778.   FOR i5|=1 TO sp5|         ! Alle Spalten durch
  4779.     FOR j5|=1 TO zl5|       ! Alle Zeilen durch
  4780.       INC k5|               ! Nächster Eintrag; Ausgeben:
  4781.       PRINT AT(sx5|+(i5|-1)*ml5|,sy5|+j5|);a5$(k5|)
  4782.     NEXT j5|                ! Nächste Zeile
  4783.   NEXT i5|                  ! Nächste Spalte
  4784.   ' ----------------------------------------------------------------------------
  4785. RETURN
  4786. > PROCEDURE a_eintrag_waehlen(wv!,ml|,sx|,sy|,sp|,zl|,VAR a$(),m|,w|)
  4787.   t2t|=26
  4788.   ' ----------------------------------------------------------------------------
  4789.   ' Diese Prozedur sorgt dafür, daß der Menüeintrag, auf den die Maus gerade
  4790.   ' zeigt, invers dargestellt wird. Dabei wird natürlich der letzte Eintrag
  4791.   ' wieder normal dargestellt. Falls der erste Übergabeparameter wv!
  4792.   ' wahr ist, so wird der erste Eintrag beim Aufruf der Prozedur automatisch
  4793.   ' invers dargestellt, so daß die Maus gar nicht mehr gebraucht wird. Ein
  4794.   ' Druck auf die [Return]-Taste reicht, um den vorgeschlagenen Eintrag als
  4795.   ' gewählt zu betrachten und die Prozedur zu verlassen. Statt der [Return]-
  4796.   ' Taste kann man auch die linke Maustaste zum entültigen wählen benutzen.
  4797.   ' ----------------------------------------------------------------------------
  4798.   LOCAL mef!               ! Maus nicht auf Menüeintrag ?
  4799.   LOCAL erst!              ! Erster Durchgang ?
  4800.   LOCAL bs!                ! Bildschirm schwarz gewesen ?
  4801.   LOCAL i|                 ! Hier steht die Eintragsnummer
  4802.   LOCAL t%                 ! Zeitmesser für Bildschirmabschaltung
  4803.   LOCAL x%                 ! Maus-x-Koordinate
  4804.   LOCAL y%                 ! Maus-y-Koordinate
  4805.   LOCAL sm%                ! Die Spalte, auf die die Maus gerade zeigt
  4806.   LOCAL zm%                ! Die Zeile, auf die die Maus gerade zeigt
  4807.   LOCAL ms%                ! Speicher für sm%
  4808.   LOCAL mz%                ! Speicher für mz%
  4809.   LOCAL st%                ! Spaltenterm
  4810.   LOCAL zt%                ! Zeilenterm
  4811.   LOCAL mx%                ! Speicher für x-Koordinate
  4812.   LOCAL my%                ! Speicher für y-Koordinate
  4813.   LOCAL b$                 ! Negativspeicher für Bildschirmrettung
  4814.   ' ............................................................................
  4815.   LET erst!=TRUE           ! Erster Durchgang
  4816.   ' ............................................................................
  4817.   REPEAT                   ! Mausabfrageschleife
  4818.     ' ..........................................................................
  4819.     LET mef!=FALSE         ! Maus ist erst mal evtl. auf Menüeintrag
  4820.     ' ..........................................................................
  4821.     IF NOT bs!             ! F Bildschirm nicht schwarz:
  4822.       SHOWM                ! Mauszeiger bitte an und zwar immer !!!
  4823.     ENDIF                  ! d
  4824.     ' ..........................................................................
  4825.     LET x%=MOUSEX          ! Maus-x-Koordinate
  4826.     LET y%=MOUSEY          ! Maus-y-Koordinate
  4827.     ' ..........................................................................
  4828.     '                      ! S c h w a r z s c h a l t u n g :
  4829.     INC t%                 ! Zeitmesser raufsetzen
  4830.     IF t%=20000            ! F Zeit für Bildschirmabschaltung:
  4831.       HIDEM                ! Maus weg
  4832.       IF bs!=FALSE         ! F Bildschirm bisher noch nicht schwarz
  4833.         SGET b$            ! Bildschirm retten
  4834.       ENDIF                ! d
  4835.       PBOX 0,0,g_bb%-1,g_bh%-1 ! Bildschirm schwarz
  4836.       LET bs!=TRUE         ! Bildschirm schwarz merken
  4837.       LET t%=0             ! Weiterlaufen ohne Overflow, deshalb null setzen
  4838.     ENDIF                  ! d
  4839.     IF (mx%<>x% OR my%<>y%) AND bs!=TRUE! F Mausbewegung + Blds.schwarz
  4840.       LET t%=0             ! Weiterlaufen ohne Overflow
  4841.       LET bs!=FALSE        ! Bildschirm nicht mehr schwarz
  4842.       SPUT b$              ! Bildschirm wieder herstellen
  4843.       SHOWM                ! Maus her
  4844.     ENDIF                  ! d
  4845.     LET mx%=MOUSEX         ! X-Koordinate der Maus merken
  4846.     LET my%=MOUSEY         ! Y-Koordinate der Maus merken
  4847.     ' ..........................................................................
  4848.     LET st%=x%-sx|*8                            ! Spaltenterm
  4849.     LET zt%=y%-sy|*16                           ! Zeilenterm
  4850.     ' Aktuelle Spalte (sm%) und Zeile (zm%) ermitteln:
  4851.     LET sm%=TRUNC((st%)/(ml|*8))+1              ! Akt.Spalte
  4852.     LET zm%=TRUNC((zt%)/16)+1                   ! Akt.Zeile
  4853.     ' ..........................................................................
  4854.     ' Beides negativ, f Maus 1 Sp. links oder 1 Zl. oberhalb des Menüs:
  4855.     IF st%<0                                               ! nicht /0
  4856.       LET sm%=0                                            ! Simuliere Sp 0
  4857.       LET zm%=0                                            ! Simuliere Z 0
  4858.       LET mef!=TRUE                                        ! M. n. auf Menü
  4859.     ENDIF                                                  ! d
  4860.     IF zt%<0                                               ! nicht /0
  4861.       LET sm%=0                                            ! Simuliere Sp 0
  4862.       LET zm%=0                                            ! Simuliere Z 0
  4863.       LET mef!=TRUE                                        ! M. n. auf Menü
  4864.     ENDIF                                                  ! d
  4865.     ' ..........................................................................
  4866.     IF sm%>sp|             ! Falls Maus rechts der letzten Spalte
  4867.       LET sm%=0            ! Simuliere Spalte 0
  4868.       LET zm%=0            ! Simuliere Zeile 0
  4869.       LET mef!=TRUE        ! Maus ist nicht auf Menüeintrag
  4870.     ENDIF                  ! d
  4871.     IF zm%>zl|             ! Falls Maus unterhalb der letzten Zeile
  4872.       LET sm%=0            ! Simuliere Spalte 0
  4873.       LET zm%=0            ! Simuliere Zeile 0
  4874.       LET mef!=TRUE        ! Maus ist nicht auf Menüeintrag
  4875.     ENDIF                  ! d
  4876.     ' ..........................................................................
  4877.     '    PRINT AT(1,15);sm%,zm%,mef!
  4878.     IF erst!=TRUE                                ! F das 1. Mal hier
  4879.       LET erst!=FALSE                            ! Durchgangsnummer > 0
  4880.       IF wv!=TRUE                                ! Menüvorschlag: ja
  4881.         LET sm%=1                                ! Simuliere Spalte 1
  4882.         LET zm%=1                                ! Simuliere Zeile 1
  4883.         LET ms%=sm%                              ! jetzige Spalte merken
  4884.         LET mz%=zm%                              ! jetzige Zeile merken
  4885.         PRINT CHR$(27);CHR$(112);                ! Invers ein
  4886.         LET i|=1                                 ! erste Eintragsnummer
  4887.         ' LET i|=(sm%-1)*zl|+zm%                 ! alte Eintragsnummer
  4888.         PRINT AT(sx|+(sm%-1)*ml|,sy|+zm%);a$(i|)
  4889.         PRINT CHR$(27);CHR$(113);                ! Invers aus
  4890.       ENDIF                                      ! d
  4891.     ELSE                                         ! Falls mind. 1mal durch
  4892.       IF mef!=FALSE                              ! Maus ist auf Menüeintrag
  4893.         IF sm%<>ms% OR zm%<>mz%                  ! Falls Sp.od.Zle geänd.
  4894.           IF ms%<>0 AND mz%<>0                   ! Letzter Eintr. vorhanden
  4895.             PRINT CHR$(27);CHR$(113);            ! Invers aus
  4896.             LET i|=(ms%-1)*zl|+mz%! alte Eintragsnummer
  4897.             PRINT AT(sx|+(ms%-1)*ml|,sy|+mz%);a$(i|)
  4898.           ENDIF                                  ! d
  4899.           PRINT CHR$(27);CHR$(112);              ! Invers ein
  4900.           LET i|=(sm%-1)*zl|+zm%                 ! neue Eintragsnummer
  4901.           PRINT AT(sx|+(sm%-1)*ml|,sy|+zm%);a$(i|)
  4902.           PRINT CHR$(27);CHR$(113);              ! Invers aus
  4903.           LET ms%=sm%                            ! jetzige Spalte merken
  4904.           LET mz%=zm%                            ! jetzige Zeile merken
  4905.         ENDIF                                    ! EF Sp. oder Zl. geändert
  4906.       ENDIF                                      ! d
  4907.     ENDIF                                        ! d
  4908.     ' ..........................................................................
  4909.     LET m|=MOUSEK                                ! Maustaste retten
  4910.     EXIT IF mef!=TRUE AND m|                     ! Raus f MT neben Menüfeld
  4911.     ' ..........................................................................
  4912.   UNTIL mef!=FALSE AND m| AND mz%<>0             ! Raus,f RMT auf Menüfeld
  4913.   ' ............................................................................
  4914.   IF mef!=TRUE                                   ! F nicht auf Menüfeld
  4915.     ' ..........................................................................
  4916.     LET w|=0                                     ! Kein Eintrag gewählt
  4917.     ' ..........................................................................
  4918.   ELSE                                           ! F auf Menüfeld
  4919.     ' ..........................................................................
  4920.     ' Gewählten Eintrag wieder normal darstellen:
  4921.     PRINT CHR$(27);CHR$(113);                    ! Invers aus
  4922.     LET i|=(ms%-1)*zl|+mz%                       ! alte Eintragsnummer
  4923.     PRINT AT(sx|+(ms%-1)*ml|,sy|+mz%);a$(i|)     ! normale Ausgabe
  4924.     ' ..........................................................................
  4925.     LET w|=i|           ! In den Rückgabepar.die Nr.d.gewählten Eintrags
  4926.     ' ..........................................................................
  4927.   ENDIF
  4928.   ' ----------------------------------------------------------------------------
  4929. RETURN
  4930. > PROCEDURE a_eintraege_waehlen(wv!,ml|,sx|,sy|,sp|,zl|,VAR a$(),a!(),m|,w|)
  4931.   t2t|=26
  4932.   ' ----------------------------------------------------------------------------
  4933.   ' Diese Prozedur sorgt dafür, daß der Menüeintrag, auf den die Maus gerade
  4934.   ' zeigt, invers dargestellt wird. Dabei wird natürlich der letzte Eintrag
  4935.   ' wieder normal dargestellt. Falls der erste Übergabeparameter wv!
  4936.   ' wahr ist, so wird der erste Eintrag beim Aufruf der Prozedur automatisch
  4937.   ' invers dargestellt, so daß die Maus gar nicht mehr gebraucht wird. Ein
  4938.   ' Druck auf die [Return]-Taste reicht, um den vorgeschlagenen Eintrag als
  4939.   ' gewählt zu betrachten und die Prozedur zu verlassen. Statt der [Return]-
  4940.   ' Taste kann man auch die linke Maustaste zum entültigen Wählen benutzen.
  4941.   ' (Die 'Return'-Taste funktioniert jetzt nicht mehr!)
  4942.   ' ----------------------------------------------------------------------------
  4943.   LOCAL mef!               ! Maus nicht auf Menüeintrag ?
  4944.   LOCAL erst!              ! Erster Durchgang ?
  4945.   LOCAL i|                 ! Hier steht die Eintragsnummer
  4946.   LOCAL x%                 ! Maus-x-Koordinate
  4947.   LOCAL y%                 ! Maus-y-Koordinate
  4948.   LOCAL sm%                ! Die Spalte, auf die die Maus gerade zeigt
  4949.   LOCAL zm%                ! Die Zeile, auf die die Maus gerade zeigt
  4950.   LOCAL ms%                ! Speicher für sm%
  4951.   LOCAL mz%                ! Speicher für mz%
  4952.   LOCAL st%                ! Spaltenterm
  4953.   LOCAL zt%                ! Zeilenterm
  4954.   ' ............................................................................
  4955.   LET erst!=TRUE           ! Erster Durchgang
  4956.   ' ............................................................................
  4957.   grosse_eingabeschleife:  ! Anfang der Hauptschleife
  4958.   ' ............................................................................
  4959.   REPEAT                   ! Mausabfrageschleife
  4960.     ' ..........................................................................
  4961.     LET mef!=FALSE         ! Maus ist erst mal evtl. auf Menüeintrag
  4962.     ' ..........................................................................
  4963.     SHOWM                  ! Mauszeiger bitte an und zwar immer !!!
  4964.     ' ..........................................................................
  4965.     LET x%=MOUSEX          ! Maus-x-Koordinate
  4966.     LET y%=MOUSEY          ! Maus-y-Koordinate
  4967.     ' ..........................................................................
  4968.     LET st%=x%-sx|*8                            ! Spaltenterm
  4969.     LET zt%=y%-sy|*16                           ! Zeilenterm
  4970.     ' Aktuelle Spalte (sm%) und Zeile (zm%) ermitteln:
  4971.     LET sm%=TRUNC((st%)/(ml|*8))+1              ! Akt.Spalte
  4972.     LET zm%=TRUNC((zt%)/16)+1                   ! Akt.Zeile
  4973.     ' ..........................................................................
  4974.     ' Beides negativ, f Maus 1 Sp. links oder 1 Zl. oberhalb des Menüs:
  4975.     IF st%<0                                               ! nicht /0
  4976.       LET sm%=0                                            ! Simuliere Sp 0
  4977.       LET zm%=0                                            ! Simuliere Z 0
  4978.       LET mef!=TRUE                                        ! M. n. auf Menü
  4979.     ENDIF                                                  ! d
  4980.     IF zt%<0                                               ! nicht /0
  4981.       LET sm%=0                                            ! Simuliere Sp 0
  4982.       LET zm%=0                                            ! Simuliere Z 0
  4983.       LET mef!=TRUE                                        ! M. n. auf Menü
  4984.     ENDIF                                                  ! d
  4985.     ' ..........................................................................
  4986.     IF sm%>sp|             ! Falls Maus rechts der letzten Spalte
  4987.       LET sm%=0            ! Simuliere Spalte 0
  4988.       LET zm%=0            ! Simuliere Zeile 0
  4989.       LET mef!=TRUE        ! Maus ist nicht auf Menüeintrag
  4990.     ENDIF                  ! d
  4991.     IF zm%>zl|             ! Falls Maus unterhalb der letzten Zeile
  4992.       LET sm%=0            ! Simuliere Spalte 0
  4993.       LET zm%=0            ! Simuliere Zeile 0
  4994.       LET mef!=TRUE        ! Maus ist nicht auf Menüeintrag
  4995.     ENDIF                  ! d
  4996.     ' ..........................................................................
  4997.     '    PRINT AT(1,15);sm%,zm%,mef!
  4998.     IF erst!=TRUE                                ! F das 1. Mal hier
  4999.       LET erst!=FALSE                            ! Durchgangsnummer > 0
  5000.       IF wv!=TRUE                                ! Menüvorschlag: ja
  5001.         LET sm%=1                                ! Simuliere Spalte 1
  5002.         LET zm%=1                                ! Simuliere Zeile 1
  5003.         LET ms%=sm%                              ! jetzige Spalte merken
  5004.         LET mz%=zm%                              ! jetzige Zeile merken
  5005.         PRINT CHR$(27);CHR$(112);                ! Invers ein
  5006.         LET i|=1                                 ! erste Eintragsnummer
  5007.         ' LET i|=(sm%-1)*zl|+zm%                 ! alte Eintragsnummer
  5008.         PRINT AT(sx|+(sm%-1)*ml|,sy|+zm%);a$(i|) ! Eintrag ausgeben
  5009.         PRINT CHR$(27);CHR$(113);                ! Invers aus
  5010.       ENDIF                                      ! d
  5011.     ELSE                                         ! Falls mind. 1mal durch
  5012.       IF mef!=FALSE                              ! Maus ist auf Menüeintrag
  5013.         IF sm%<>ms% OR zm%<>mz%                  ! Falls Sp.od.Zle geänd.
  5014.           IF ms%<>0 AND mz%<>0                   ! Letzter Eintr. vorhanden
  5015.             PRINT CHR$(27);CHR$(113);            ! Invers aus
  5016.             LET i|=(ms%-1)*zl|+mz%               ! alte Eintragsnummer
  5017.             IF a!(i|)=FALSE                      ! F nicht gewählt:
  5018.               PRINT AT(sx|+(ms%-1)*ml|,sy|+mz%);a$(i|)  ! Eintrag ausgeben
  5019.             ENDIF                                ! d
  5020.           ENDIF                                  ! d
  5021.           PRINT CHR$(27);CHR$(112);              ! Invers ein
  5022.           LET i|=(sm%-1)*zl|+zm%                 ! neue Eintragsnummer
  5023.           PRINT AT(sx|+(sm%-1)*ml|,sy|+zm%);a$(i|)
  5024.           PRINT CHR$(27);CHR$(113);              ! Invers aus
  5025.           LET ms%=sm%                            ! jetzige Spalte merken
  5026.           LET mz%=zm%                            ! jetzige Zeile merken
  5027.         ENDIF                                    ! EF Sp. oder Zl. geändert
  5028.       ENDIF                                      ! d
  5029.     ENDIF                                        ! d
  5030.     ' ..........................................................................
  5031.     LET m|=MOUSEK                                ! Maustaste retten
  5032.     IF m|=2                                      ! F rechte Maustaste:
  5033.       LET mef!=TRUE                              ! Auch raus
  5034.     ENDIF                                        ! d
  5035.     EXIT IF mef!=TRUE AND m|                     ! Raus f MT neben Menüfeld
  5036.     ' ..........................................................................
  5037.   UNTIL mef!=FALSE AND m| AND mz%<>0             ! Raus,f RMT auf Menüfeld
  5038.   ' ............................................................................
  5039.   IF mef!=FALSE                                  ! F auf Menüfeld
  5040.     ' ..........................................................................
  5041.     ' Gewählten Eintrag merken, d.h. in a!() als gewählt/nicht gew. verzeichnen:
  5042.     ' ..........................................................................
  5043.     LET i|=(ms%-1)*zl|+mz%                       ! alte Eintragsnummer
  5044.     ' ..........................................................................
  5045.     IF a!(i|)=TRUE                               ! F bereits gewählt:
  5046.       LET a!(i|)=FALSE                           ! Code für 'Eintrag nicht gew.'
  5047.       PRINT CHR$(27);CHR$(113);                  ! Invers aus
  5048.       PRINT AT(sx|+(ms%-1)*ml|,sy|+mz%);a$(i|)   ! Eintrag ausgeben
  5049.     ELSE                                         ! F noch nicht gewählt:
  5050.       LET a!(i|)=TRUE                            ! Code für 'Eintrag gewählt'
  5051.       PRINT CHR$(27);CHR$(112);                  ! Invers ein
  5052.       PRINT AT(sx|+(ms%-1)*ml|,sy|+mz%);a$(i|)   ! Eintrag ausgeben
  5053.       LET w|=1                                   ! etwas gewählt
  5054.     ENDIF                                        ! EFU bereits gewählt/nicht gew
  5055.     ' ..........................................................................
  5056.     REPEAT            ! Warteschleife für Mauseingabe:
  5057.     UNTIL MOUSEK=0    ! Erst Raus,wenn Maus nix mehr meldet,also Puffer leer
  5058.     ' ..........................................................................
  5059.     GOTO grosse_eingabeschleife                  ! geh zum Anfang der Hauptschl.
  5060.     ' ..........................................................................
  5061.   ENDIF                                          ! d
  5062.   PRINT CHR$(27);CHR$(113);                      ! Invers aus
  5063.   ' ----------------------------------------------------------------------------
  5064. RETURN
  5065. > PROCEDURE a_eintraginput(ml7|,di7|,sx7|,sy7|,sp7|,zl7|,m7|,w7|,VAR a7$())
  5066.   t2t|=27
  5067.   ' ----------------------------------------------------------------------------
  5068.   ' Hier kann man in einem Menüeintrag etwas eingeben.
  5069.   ' ----------------------------------------------------------------------------
  5070.   LOCAL si7|                ! Spalte für Input
  5071.   LOCAL zi7|                ! Zeile für Input
  5072.   ' ............................................................................
  5073.   '  si7|=TRUNC(w7|/sp7|)+1                       ! Spalte f.Input
  5074.   '  PRINT AT(1,1);"w7|,sp7|,si7|,zl7|"           ! Zeile f. Input
  5075.   '  PRINT AT(1,2);w7|,sp7|,si7|,zl7|             ! Zeile f. Input
  5076.   '  zi7|=w7|-(si7|-1)*zl7|                       ! Zeile f. Input
  5077.   ' ..........................................................................
  5078.   LET x7%=MOUSEX                                  ! Maus-x-Koordinate
  5079.   LET y7%=MOUSEY                                  ! Maus-y-Koordinate
  5080.   LET st7%=x7%-sx7|*8                             ! Spaltenterm
  5081.   LET zt7%=y7%-sy7|*16                            ! Zeilenterm
  5082.   ' Aktuelle Spalte (sm7%) und Zeile (zm7%) ermitteln:
  5083.   LET sm7%=TRUNC((st7%)/(ml7|*8))+1               ! Akt.Spalte
  5084.   LET zm7%=TRUNC((zt7%)/16)+1                     ! Akt.Zeile
  5085.   LET si7|=sm7%                                   ! Var-Type ändern
  5086.   LET zi7|=zm7%                                   ! Var-Type ändern
  5087.   ' ............................................................................
  5088.   '  PRINT AT(sx7|+(si7|-1)*ml7|-1,sy7|+zi7|);    ! Positionieren
  5089.   ' ............................................................................
  5090.   LET a$=a7$(w7|)                                 ! Zwischenspeicher
  5091.   @a_input(sx7|+(si7|-1)*ml7|,sy7|+zi7|,ml7|-1,m7|,a$)! Eingabe
  5092.   LET a7$(w7|)=a$                                 ! Rückgabe
  5093.   '  FORM INPUT ml7|-1 AS a7$(w7|)                ! Eingabe
  5094.   ' ............................................................................
  5095.   ' Alle Strings wurden, um das Input überhaupt zu ermöglichen, um di7|
  5096.   ' Spaces am rechten Rand erweitert, das muß auch mit dem geängerten
  5097.   ' String geschehen. Das passiert in der folgenden Zeile:
  5098.   LET a7$(w7|)=a7$(w7|)+SPACE$(di7|)
  5099.   ' ----------------------------------------------------------------------------
  5100. RETURN
  5101. > PROCEDURE a_input(sp|,zl|,l|,m|,VAR a$)
  5102.   ' ----------------------------------------------------------------------------
  5103.   ' sp|                                 ! Startspalte der Eingabe
  5104.   ' zl|                                 ! Startzeile der Eingabe
  5105.   ' l|                                  ! Sollänge der Eingabe
  5106.   ' a$                                  ! Eingabestring,evtl. ist Vorschlag drin
  5107.   LOCAL z|                              ! Ascii-Speicher für eingegebenes Zeichn
  5108.   LOCAL al|                             ! Aktuelle Länge des Eingabestrings
  5109.   ' ............................................................................
  5110.   LET a$=LEFT$(a$,l|)                   ! Überflüssiges am Vorschlagstring weg.
  5111.   ' ............................................................................
  5112.   PRINT AT(sp|,zl|);a$;CHR$(27);CHR$(112);" ";CHR$(27);CHR$(113); ! Cursor ein
  5113.   ' ............................................................................
  5114.   HIDEM                   ! Mauspfeil weg
  5115.   REPEAT                  ! Warteschleife für Mauseingabe:
  5116.   UNTIL MOUSEK=0          ! Erst Raus,wenn Maus nix mehr meldet,also Puffer leer
  5117.   ' ............................................................................
  5118.   DO                                    ! Hauptschleifenanfang
  5119.     ' ..........................................................................
  5120.     REPEAT                              ! Eingabeschleife
  5121.       LET z|=ASC(INKEY$)                ! Zeichen von der Tastatur lesen
  5122.       LET m|=MOUSEK                     ! Maustaste retten
  5123.       IF MOUSEK                         ! F Maustaste gedrückt
  5124.         LET z|=13                       ! Tu so, als sei 'Return'-Taste gedrückt
  5125.       ENDIF                             ! d
  5126.     UNTIL z|=8 OR z|=13 OR z|>31        ! Raus f Zeichen eingegeben
  5127.     LET al|=LEN(a$)                     ! Aktuelle Länge abspeichern
  5128.     EXIT IF z|=13                       ! Raus f 'RETURN'-Taste gedrückt
  5129.     ' ..........................................................................
  5130.     IF z|=8 AND al|>0                   ! F 'BACKSPACE'-Taste und String<>leer
  5131.       LET a$=LEFT$(a$,al|-1)            ! Backspace ausführen
  5132.       DEC al|                           ! Aktuelle Stringlänge aktualisieren
  5133.       PRINT AT(sp|,zl|);a$;CHR$(27);CHR$(112);" ";CHR$(27);CHR$(113);! Zchn raus
  5134.       IF al|<l|                         ! F akt. Länge < Sollänge
  5135.         PRINT SPACE$(l|-al|)            ! rechts Vom Cursor weiß
  5136.       ENDIF                             ! d
  5137.     ELSE IF al|<l| AND z|>31            ! F Normale Taste und kleiner Maxlänge
  5138.       LET a$=a$+CHR$(z|)                ! Eingabestring erweitern
  5139.       LET a$=UPPER$(a$)                 ! Nur Großbuchstaben
  5140.       INC al|                           ! Aktuelle Stringlänge aktualisieren
  5141.       PRINT AT(sp|,zl|);a$;CHR$(27);CHR$(112);" ";CHR$(27);CHR$(113);! Zchn raus
  5142.       IF al|<l|                         ! F akt. Länge < Sollänge
  5143.         PRINT SPACE$(l|-al|)            ! rechts Vom Cursor weiß
  5144.       ENDIF                             ! d
  5145.     ENDIF                               ! d
  5146.     ' ..........................................................................
  5147.   LOOP                                  ! Hauptlschleifenende
  5148.   ' ............................................................................
  5149.   LET a$=a$+SPACE$(l|-al|)              ! Rechts mit Spaces auffüllen
  5150.   ' ----------------------------------------------------------------------------
  5151. RETURN
  5152. > PROCEDURE a_menueeintraege_minus_di8(sp8|,zl8|,ml8|,di8|,VAR a8$())
  5153.   ' ----------------------------------------------------------------------------
  5154.   ' Hier wird die zusätzliche Länge für Input wieder abgezogen
  5155.   ' ----------------------------------------------------------------------------
  5156.   LOCAL i8|                         ! Zähler für Einträge
  5157.   ' ............................................................................
  5158.   LET di8|=1                        ! Für Input zusätliche di8| Spaces
  5159.   ' ............................................................................
  5160.   FOR i8|=1 TO sp8|*zl8|            ! Alle Einträge durch
  5161.     LET a8$(i8|)=LEFT$(a8$(i8|),ml8|-di8|)  ! Inputlängenzugabe wieder abziehen
  5162.   NEXT i8|                          ! nächster Eintrag
  5163.   ' ----------------------------------------------------------------------------
  5164. RETURN
  5165. ' ##############################################################################
  5166. '  D a t e n
  5167. ' ##############################################################################
  5168. > PROCEDURE 0_menuedaten
  5169.   ' ----------------------------------------------------------------------------
  5170.   hauptmenue:
  5171.   DATA  Stückmenü
  5172.   DATA  Hauptfile
  5173.   DATA  Blockmenü
  5174.   DATA  Parameter
  5175.   DATA  Menü-Exit
  5176.   DATA ##
  5177.   ' ............................................................................
  5178.   stueckmenue:
  5179.   DATA Stück auf Disk speichern
  5180.   DATA Stück von Disk laden
  5181.   DATA ----------------------------
  5182.   DATA Stück in Hauptfile speichern
  5183.   DATA Stück von Hauptfile laden
  5184.   DATA ----------------------------
  5185.   DATA bestimmte Stücke drucken
  5186.   DATA bestimmte Stücke spielen
  5187.   DATA ##
  5188.   ' ............................................................................
  5189.   hauptfile:
  5190.   DATA Hauptfile neuanlegen
  5191.   DATA Hauptfile neu laden
  5192.   DATA Hauptfile abspeichern
  5193.   DATA ----------------------------
  5194.   DATA beliebiges Diskfile löschen
  5195.   DATA Diskfile umbenennen
  5196.   DATA ----------------------------
  5197.   DATA Inhaltsverzeichnis drucken
  5198.   DATA Ab x alle Stücke drucken
  5199.   DATA Ab x alle Stücke spielen
  5200.   DATA ##
  5201.   ' ............................................................................
  5202.   blockmenue:
  5203.   DATA Anfang
  5204.   DATA Ende
  5205.   DATA Marken löschen
  5206.   DATA ------------------
  5207.   DATA kopieren
  5208.   DATA doppelt so schnell
  5209.   DATA halb so schnell
  5210.   DATA transponieren
  5211.   DATA ------------------
  5212.   DATA löschen
  5213.   DATA ##
  5214.   ' ............................................................................
  5215.   parameter:
  5216.   DATA Abspielgeschwindigkeit
  5217.   DATA Pause zw. den Stücken
  5218.   DATA Midi ein/aus schalten
  5219.   DATA ##
  5220.   ' ............................................................................
  5221.   menue_exit:
  5222.   DATA Eingabe fortsetzen
  5223.   DATA ------------------
  5224.   DATA Edit
  5225.   DATA ------------------
  5226.   DATA Quit
  5227.   DATA ##
  5228.   ' ----------------------------------------------------------------------------
  5229. RETURN
  5230. > PROCEDURE 0_tonleiterdaten
  5231.   tonleiter:
  5232.   DATA C,#C,D,#D,E,F,#F,G,#G,A,#A,H,PP
  5233. RETURN
  5234. > PROCEDURE 0_hilfstext_mit_befehlstabelle
  5235.   ' ----------------------------------------------------------------------------
  5236.   ' Hier befindet sich bisher nur der Hilfstext, den man über die Help-Taste
  5237.   ' erreichen kann.
  5238.   ' ----------------------------------------------------------------------------
  5239.   '
  5240.   helptext:
  5241.   '
  5242.   DATA Prg zum Schreiben von Flötenstücken 'NOTEDITA.GFA' 1.0 |
  5243.   DATA
  5244.   DATA
  5245.   DATA
  5246.   DATA
  5247.   DATA
  5248.   DATA
  5249.   DATA
  5250.   DATA
  5251.   DATA
  5252.   DATA ################################################################################
  5253.   DATA         | linksoben  | Notentaste | rechtsoben | Notentext  | Cursor   |
  5254.   DATA
  5255.   DATA         |--------------------------------------------------------------|
  5256.   DATA     LMT | Pause      | 1/8 Note   | Pause      | Cursorpos. | Taktstr. |
  5257.   DATA         |------------+------------+------------+------------+----------|
  5258.   DATA     RMT | Hauptmenü  | Nur Ton    | Backspace  | Abspielen  | Fähnchen |
  5259.   DATA         |--------------------------------------------------------------|
  5260.   DATA ################################################################################
  5261.   DATA      'LMT'=linke Maustaste /  'RMT'=rechte Maustaste / 'Taktstr.'=Taktstrich
  5262.   DATA ################################################################################
  5263.   DATA ############ !!!! Der Verkauf des Programms ist nicht erlaubt  !!!! ############
  5264.   DATA ############ Das Programm darf nur unverändert weitergegeben werden ############
  5265.   DATA ################################################################################
  5266.   DATA  Zurück zum Editor: Maustaste        /        Autor: M.Mittelmaier   Sommer '89
  5267.   DATA **
  5268.   '
  5269.   '
  5270.   '
  5271.   ' ----------------------------------------------------------------------------
  5272. RETURN
  5273. > PROCEDURE 0_frequenzdaten
  5274.   frequenzen:
  5275.   ' ----------------------------------------------------------------------------
  5276.   ' Erst die Halbtonfrequenzen:
  5277.   ' ----------------------------------------------------------------------------
  5278.   '             c1
  5279.   DATA 262
  5280.   '             cis1
  5281.   DATA 275
  5282.   '             d1
  5283.   DATA 294
  5284.   '             dis1
  5285.   DATA 312
  5286.   '             e1
  5287.   DATA 330
  5288.   '             f1
  5289.   DATA 350
  5290.   '             fis1
  5291.   DATA 371
  5292.   '             g1
  5293.   DATA 393
  5294.   '             gis1
  5295.   DATA 415
  5296.   '             a1
  5297.   DATA 440
  5298.   '             ais1
  5299.   DATA 466
  5300.   '             h1
  5301.   DATA 495
  5302.   '             c2
  5303.   DATA 526
  5304.   '             cis2
  5305.   DATA 558
  5306.   '             d2
  5307.   DATA 591
  5308.   '             dis2
  5309.   DATA 625
  5310.   '             e2
  5311.   DATA 662
  5312.   '             f2
  5313.   DATA 701
  5314.   '             fis2
  5315.   DATA 744
  5316.   '             g2
  5317.   DATA 787
  5318.   '             gis2
  5319.   DATA 838
  5320.   '             a2
  5321.   DATA 880
  5322.   '             ais2
  5323.   DATA 933
  5324.   '             h2
  5325.   DATA 990
  5326.   '             c3
  5327.   DATA 1050
  5328.   ' ----------------------------------------------------------------------------
  5329.   ' Nun die Vierteltonfrequenzen:
  5330.   ' ----------------------------------------------------------------------------
  5331.   '             c1       + Viertelton
  5332.   DATA 268
  5333.   '             cis1     + Viertelton
  5334.   DATA 282
  5335.   '             d1       + Viertelton
  5336.   DATA 303
  5337.   '             dis1     + Viertelton
  5338.   DATA 321
  5339.   '             e1       + Viertelton
  5340.   DATA 340
  5341.   '             f1       + Viertelton
  5342.   DATA 360
  5343.   '             fis1     + Viertelton
  5344.   DATA 382
  5345.   '             g1       + Viertelton
  5346.   DATA 404
  5347.   '             gis1     + Viertelton
  5348.   DATA 427
  5349.   '             a1       + Viertelton
  5350.   DATA 453
  5351.   '             ais1     + Viertelton
  5352.   DATA 480
  5353.   '             h1       + Viertelton
  5354.   DATA 510
  5355.   '             c2       + Viertelton
  5356.   DATA 542
  5357.   '             cis2     + Viertelton
  5358.   DATA 574
  5359.   '             d2       + Viertelton
  5360.   DATA 608
  5361.   '             dis2     + Viertelton
  5362.   DATA 643
  5363.   '             e2       + Viertelton
  5364.   DATA 681
  5365.   '             f2       + Viertelton
  5366.   DATA 722
  5367.   '             fis2     + Viertelton
  5368.   DATA 765
  5369.   '             g2       + Viertelton
  5370.   DATA 809
  5371.   '             gis2     + Viertelton
  5372.   DATA 856
  5373.   '             a2       + Viertelton
  5374.   DATA 906
  5375.   '             ais2     + Viertelton
  5376.   DATA 961
  5377.   '             h2       + Viertelton
  5378.   DATA 1020
  5379.   '             c3       + Viertelton
  5380.   DATA 1082
  5381.   ' ----------------------------------------------------------------------------
  5382. RETURN
  5383. > PROCEDURE 0_daten_fuer_notenschluessel
  5384.   ' ----------------------------------------------------------------------------
  5385.   notenschluessel:
  5386.   DATA 170,169,170,168,167,168,167,169,168,171
  5387.   DATA 173,172,173,170,173,167,170,166,169,165
  5388.   DATA 167,165,166,165,164,170,165,173,169,175
  5389.   DATA 173,175,176,173,177,169,177,166,168,133
  5390.   DATA 167,120,172,116,176,115,176,115,178,117
  5391.   DATA 180,118,181,122,181,126,180,130,179,133
  5392.   DATA 165,146,164,151,164,158,169,160,176,161
  5393.   DATA 180,159,180,153,178,149,173,148,168,148
  5394.   DATA 167,149,167,154,172,157,174,157,178,157
  5395.   DATA -1,-1
  5396.   ' ----------------------------------------------------------------------------
  5397. RETURN
  5398. > PROCEDURE 0_daten_fuer_programmname
  5399.   ' ----------------------------------------------------------------------------
  5400.   programmname:
  5401.   DATA 451,13,452,9,457,4,464,4,467,8
  5402.   DATA 467,13,477,3,467,13,478,13,488,7
  5403.   DATA 481,11,485,13,498,13,499,8,490,4
  5404.   DATA 487,6,489,7,487,9,497,8,504,11
  5405.   DATA 517,4,518,12,518,14,515,8,515,8
  5406.   DATA 518,9,521,10,525,10,518,10,513,9
  5407.   DATA 513,9,511,9,519,14,526,15,537,13
  5408.   DATA 540,7,534,6,532,9,541,14,547,14
  5409.   DATA 559,9,552,10,552,12,556,14,562,15
  5410.   DATA 565,11,559,8,564,10,568,3,565,14
  5411.   DATA 565,14,571,13,578,9,579,6,577,4
  5412.   DATA 577,4,579,4,580,4,581,4,583,5
  5413.   DATA 584,5,580,5,579,5,579,5,579,8
  5414.   DATA 579,9,579,11,582,13,586,13,595,12
  5415.   DATA 599,6,601,3,601,7,601,13,601,13
  5416.   DATA 601,13,602,11,602,8,599,7,596,9
  5417.   DATA 596,9,599,8,603,8,606,7,597,6
  5418.   DATA 595,6,601,12,603,14,609,13,617,8
  5419.   DATA 622,6,629,6,620,6,616,10,616,11
  5420.   DATA 621,13,627,12,629,7,629,11,631,13
  5421.   DATA 632,13,631,13
  5422.   DATA -1,-1
  5423.   ' ----------------------------------------------------------------------------
  5424. RETURN
  5425. ' ##############################################################################
  5426. '  D o k u m e n t a t i o n :
  5427. ' ##############################################################################
  5428. > PROCEDURE 0_konzept_fuer_das_aussehen_einer_einzelnen_note
  5429.   ' ----------------------------------------------------------------------------
  5430.   '       Muster einer Note mit Notenhals nach unten:
  5431.   ' ----------------------------------------------------------------------------
  5432.   '
  5433.   '
  5434.   '
  5435.   '
  5436.   '            1
  5437.   '    0123456789012345 = n_nb| Notenbsp.: oberes cis (ex. nicht, nur bis c):
  5438.   '                          Das cis ist mit der vorherigen Note gebunden,
  5439.   '                          betont,erhöht (nicht erhöht wäre es c) & 1/32 lang.
  5440.   '
  5441.   '
  5442.   '    #############  <-- Obereste Begrenzungslinie
  5443.   ' 0   1             <-- 1. Punkt im Notenrechteck=g_y%(?)
  5444.   ' 1   2
  5445.   ' 2   3
  5446.   ' 3   4
  5447.   ' 4   5
  5448.   ' 5 ++6+1
  5449.   ' 6   1
  5450.   ' 7   2
  5451.   ' 8   3
  5452.   ' 9   4
  5453.   ' 10  5   ######
  5454.   ' 1 ++6+2 #    #    <-- Gebunden mit vorheriger Note ( Box: gd|,gh|,gx|,gy| )
  5455.   ' 2   1   ######
  5456.   ' 3   2
  5457.   ' 4   3
  5458.   ' 5   4   ######    <-- Notenkopf ( Pbox: kb|, kh|, kx|, ky| )
  5459.   ' 6   5   ######
  5460.   ' 7 ++6+3#########  <-- Hilfslinie a2 (line: ha2x|, ha2y|, hd| )
  5461.   ' 8   1   ######
  5462.   ' 9   2   ######
  5463.   ' 20  3  #########  <-- Hilfslinie h2 (line: hh2x|, hh2y|, hd| )
  5464.   ' 1   4   #
  5465.   ' 2   5   ####      <-- Betonungszeichen ( Pbox: bb|, bh|, bx|, by| )
  5466.   ' 3 ++6+4#########  <-- Hilfslinie c3 (line: hc3x|, hc3y|, hd| )
  5467.   ' 4   1   ####
  5468.   ' 5   2   #         <-- Notenhals ( Line: lx|, lsy|, ley|
  5469.   ' 6   3   ######
  5470.   ' 7   4   ##  ##     <-- Notenhöhen-Info: Kreuz ( 1.Box: xl|,hb|, hh|, hy|
  5471.   ' 8   5   ##  ##                                  2.Box: xr|, "    "    "  )
  5472.   ' 9 ++6+5 ##  ##     <-- 1.Notenlinie ( n1y| bei: '1_notenlinien'
  5473.   ' 30  1   ######
  5474.   ' 1   2   #
  5475.   ' 2   3   #   ##
  5476.   ' 3   4   #  ##     <-- 32-tel-Fähnchen ( Line: ax1|,a32y1|,ax2|,a32y2| )
  5477.   ' 4   5   # ##      <-- 32-tel-Fähnchen ( Line: ax1|,b32y1|,bx2|,a32y2| )
  5478.   ' 5 ++6+6 ###
  5479.   ' 6   1   ##  ##
  5480.   ' 7   2   #  ##     <-- 16-tel-Fähnchen ( Line: ax1|,a16y1|,ax2|,a16y2 )
  5481.   ' 8   3   # ##      <-- 16-tel-Fähnchen ( Line: ax1|,b16y1|,bx2|,a16y2 )
  5482.   ' 9   4   ###
  5483.   ' 40  5   ##  ##
  5484.   ' 1 ++6+7 #  ##     <-- 8-tel-Fähnchen  ( Line ax1|,a8y1|,ax2|,a8y2 )
  5485.   ' 2   1   # ##      <-- 8-tel-Fähnchen  ( Line ax1|,b8y1|,bx2|,a8y2 )
  5486.   ' 3   2   ###
  5487.   ' 4   3   ##
  5488.   ' 5   4
  5489.   ' 6   5
  5490.   ' 7 ++6+8      #
  5491.   ' 8   1        #
  5492.   ' 9   2        #
  5493.   ' 50  3        #    <-- Notenhals vom c1
  5494.   ' 1   4        #
  5495.   ' 2   5        #
  5496.   ' 3 ++6+9      #
  5497.   ' 4   1        #
  5498.   ' 5   2        #
  5499.   ' 6   3        #
  5500.   ' 7   4   ######
  5501.   ' 8   5   ######
  5502.   ' 9 ++6+1#########  <-- Hilfslinie c1 (line: hc1x|, hc1y|, hd| ) .
  5503.   ' 60  1   ######
  5504.   ' 1   2   ######
  5505.   ' 2   3
  5506.   ' 3   4             <-- falscher Anfang vom gespiegelten Gebundenzei-
  5507.   ' 4   5   ######        chen bei '3_gebundenzeichen()'. (*):s.Zeile 66.
  5508.   ' 5 ++6+11#    #
  5509.   ' 6   1   ######    <-- richtiger Anfang für Gebundenzeichen vom c1. Diff. v.
  5510.   ' 7   2                 falschen Anfang bei (*) wird bei '2_noten_foto()' ge-
  5511.   ' 8   3                 braucht: ( rga%=-3 ):
  5512.   ' 9   4
  5513.   ' 70  5
  5514.   ' 1 ++6+12
  5515.   ' 2 ################# <-- unterste Begrenzungslinie
  5516.   ' 3      <-- 1.Pkt d.benachbarten,unt.Notenbereichs=g_y%(?')=g_y%(?)+g_nzlh|
  5517.   '            g_nzlh|=73
  5518.   ' ----------------------------------------------------------------------------
  5519. RETURN
  5520. > PROCEDURE 0_konzept_fuer_die_notendarstellung_im_edr
  5521.   ' ----------------------------------------------------------------------------
  5522.   ' 0.) Der Bildschirm wird unterhalb der Klaviatur in 5 Notenzeilen und 80
  5523.   '     Notenspalten aufgebaut. Das Konzept der Notendarstellung soll nun so
  5524.   '     aussehen, daß man nur noch die gewünschte Notenposition, also eine
  5525.   '     dieser Notenspalten bzw. -zeilen angeben muß und die gewünschten Eigen-
  5526.   '     schaften, wie Höhe, Länge, usw.
  5527.   ' 1.) Alle möglichen Notenformen werden gezeichnet und fotografiert, d.h.
  5528.   '     im Array 'g_nb$()' als einzelne Bilder abgespeichert. Die Argumente
  5529.   '     dieses Arrays entsprechen den Eigenschaften der entsprechenden Note:
  5530.   '     Im 1. Argument steht die Notenhöhe, im 2. die Länge dh. die Fähnchenzahl
  5531.   '     im 3. ob gebunden (=1) oder nicht(=0) im 4. ob betont oder nicht.
  5532.   ' 2.) Die 'Fotokamera' wird so plaziert, daß später nur noch Spalte und Zeile
  5533.   '     einer Note als Argumente für den Put-Befehl zum Projezieren der Photos
  5534.   '     angegeben werden müssen.
  5535.   ' ----------------------------------------------------------------------------
  5536. RETURN
  5537. > PROCEDURE 0_konzept_zur_speicherung_der_noten
  5538.   ' ----------------------------------------------------------------------------
  5539.   ' 1.) Wenn man das Programm startet und erst einmal ein neues Notenstück
  5540.   '     schreibt, werden dessen Noten zunächst nur im 'g_n$()'-Array abgelegt.
  5541.   ' 2.) Speichert man dieses Notenstück nun ab, so wird es nicht als einzelnes
  5542.   '     File auf Diskette geschrieben, sondern in das sogenannte 'Hauptfile'
  5543.   '     eingebaut. In diesem Hauptfile haben 160 Notenstücke zu je 200 Noten
  5544.   '     Platz. Beim Speichern und Laden, kann man nun aus diesen 160 Stücken
  5545.   '     eins auswählen, das überschrieben bzw. in den g_n$()-Array zur aktuellen
  5546.   '     Bearbeitung geladen werden soll. Dabei sind Stücke mit dem Namen
  5547.   '     '________' leer.
  5548.   '     Gibt man beim Abspeichern den Leerstring '________'
  5549.   '     ein, so wird das entsprechende Stück im Hauptfile gelöscht.
  5550.   ' 3.) Man kann dieses Hauptfile über die Prozedur 'ende_file_drck' auf eine
  5551.   '     andere Diskette kopieren, bzw. ein neues auf einer Diskette anlegen,
  5552.   '     auf welcher sich noch kein Hauptfile befindet.
  5553.   ' ----------------------------------------------------------------------------
  5554. RETURN
  5555. > PROCEDURE 0_zeichenprogramm
  5556.   ' ----------------------------------------------------------------------------
  5557.   ' Mit diesem Kleinen Programm wurde der Notenschlüssel für die Druckfunktion
  5558.   ' gezeichnet. Dafür muß es an den Programmanfang, genau hinter der Zeile
  5559.   ' '@0_programmbild_malen' verschoben werden. Verwende dazu die Zeile:
  5560.   '  @0_zeichnenprogramm
  5561.   ' Die durch die linke Maustaste
  5562.   ' markierten Punkte werden dann in Form von Datazeilen auf Diskette ge-
  5563.   ' speichert und können durch die Funktion 'Merge' vom Editor aus in den
  5564.   ' Programmtext aufgenommen werden.
  5565.   ' Die Prozedur, die die in den Programmtext bereits aufgenommenen Data-
  5566.   ' zeilen verwertet, d.h.`das Bild reproduziert, hat in 'NOTEDITA' den
  5567.   ' Namen '1_notenschluessel'.
  5568.   ' ............................................................................
  5569.   LOCAL m|                      ! Maustaste
  5570.   LOCAL r|                      ! Menüauswahl
  5571.   LOCAL a%                      ! Höchstanzahl aller Punkte
  5572.   LOCAL i%                      ! Punkt-/Zeilen-zähler
  5573.   LOCAL j%                      ! Spaltenzähler
  5574.   ' ............................................................................
  5575.   '                             ! Alles ab hier muß hinter '@0_progra.'
  5576.   nochmal_zeichnen:             ! Label
  5577.   '  SPUT g_lb$                    ! Löschbild
  5578.   '                             ! Bilderrahmen:
  5579.   BOX g_x%(51),g_y%(51),g_x%(51)+2*g_nb|-1,g_y%(51)+g_nzlh|-2
  5580.   LET a%=100                    ! Höchstens hundert Punkte (auch mehr möglich)
  5581.   DIM x%(a%),y%(a%)             ! Koordinatenarray dimensionieren
  5582.   LET x%(0)=g_x%(51)            ! x-Startwert festlegen
  5583.   LET y%(0)=g_y%(51)            ! y-Startwert festlegen
  5584.   REPEAT                        ! Hauptzeichenschleife
  5585.     REPEAT                      ! Schleife, um Mauspuffer
  5586.     UNTIL MOUSEK=0              ! zu leeren
  5587.     REPEAT                      ! Warten auf
  5588.       LET m|=MOUSEK             ! Mausklick
  5589.     UNTIL m|                    ! d
  5590.     PRINT AT(1,1);"i%='";i%;"'" ! d
  5591.     INC i%                      ! Punktzähler um eins erhöhen
  5592.     LET x%(i%)=MOUSEX           ! x-Koordinate vom akt. Pkt. festlegen
  5593.     LET y%(i%)=MOUSEY           ! y-Koordinate vom akt. Pkt. festlegen
  5594.     IF i%>1                     ! f schon ein Punkt da:
  5595.       LINE x%(i%-1),y%(i%-1),x%(i%),y%(i%)  ! Linie vom alten zum akt Punkt
  5596.     ENDIF                       ! d
  5597.   UNTIL m|=2                    ! Raus ausZeichenschleife,falls rechte Maustaste
  5598.   ' ............................................................................
  5599.   @a_alert("Nochmal zeichnen?/Ja|Abspeichern",r|) ! d
  5600.   IF r|=1                       ! f ja gewählt:
  5601.     CLS                         ! Bildschirm löschen
  5602.     LET i%=0                    ! Punktzähler null
  5603.     ERASE x%(),y%()             ! Punktkoordinatenarrays löschen
  5604.     GOTO nochmal_zeichnen       ! von neuem Zeichnen
  5605.   ENDIF                         ! d
  5606.   LET a%=i%                     ! Höchstanzahl der Punkte neu setzen
  5607.   ' ............................................................................
  5608.   OPEN "O",#1,"NOTENS.LST"      ! File auf Diskette zum schreiben öffnen
  5609.   FOR i%=1 TO a%                ! alle Punkte durch
  5610.     IF FRAC(j%/5)=0             ! f neuer Zeilenanfang ansteht:
  5611.       LET j%=1                  ! Spaltenzähler initialisieren
  5612.       PRINT #1,                 ! neue Zeile
  5613.       PRINT #1,"DATA ";         ! 'DATA' an den Anfang der neuen Zeile
  5614.     ELSE                        ! f mitten in Zeile
  5615.       INC j%                    ! nur Spaltenzähler um eins erhöhen
  5616.     ENDIF                       ! d
  5617.     IF i%<a% AND j%<5           ! f noch nicht zu Ende und in Zeilenmitte:
  5618.       PRINT #1,x%(i%);",";y%(i%);","; ! Koordinaten raus, mit Komma am Schluß
  5619.     ELSE                        ! f am Ende oder am Zeilenende
  5620.       PRINT #1,x%(i%);",";y%(i%); ! Koordinaten raus, ohne Komma am Schluß
  5621.     ENDIF                       ! d
  5622.   NEXT i%                       ! nächster Punkt
  5623.   PRINT #1                      ! neue Zeile
  5624.   PRINT #1,"DATA -1,-1"         ! Schlußdaten
  5625.   CLOSE #1                      ! File auf Diskette schließen
  5626.   ' ............................................................................
  5627.   EDIT                          ! Zurück in den Editor
  5628.   ' ----------------------------------------------------------------------------
  5629. RETURN
  5630. > PROCEDURE 0_ausfuehrliche_befehlsdokumentation_fuer_noteneingabe
  5631.   ' ----------------------------------------------------------------------------
  5632.   ' Achtung!  Erst Zeilen-, dann Spaltennummer ! ! !
  5633.   '
  5634.   '
  5635.   '              1.Spalte:    2.Spalte:    3.Spalte:    4.Spalte:    5.Spalte:
  5636.   '
  5637.   '            | linksoben  | Notentaste | rechtsoben | Notentext  | Cursor   |
  5638.   '
  5639.   '            |--------------------------------------------------------------|
  5640.   ' 1  LMT     | Pause      | 1/8 Note   | Pause      | Cursorpos. | Taktstr. |
  5641.   '            |------------+------------+------------+------------+----------|
  5642.   ' 2  RMT     | Hauptmenü  | Nur Ton    | Backspace  | Abspielen  | Fähnchen |
  5643.   '            |--------------------------------------------------------------|
  5644.   '
  5645.   '
  5646.   ' ----------------------------------------------------------------------------
  5647.   '
  5648.   '
  5649.   '   Jetzt die 1. Zeile
  5650.   '
  5651.   '
  5652.   ' ----------------------------------------------------------------------------
  5653.   '
  5654.   '
  5655.   '
  5656.   ' * S p a l t e  1  : 'l. Pausentaste'    Zeile1: 'LMT'
  5657.   '   (linke Pausentaste auf Klaviatur und linke Maustaste)
  5658.   '   'Pause':       Funktioniert, wenn kein Blockbereich definiert ist:
  5659.   '                  Es wird eine 1/8-tel-Pause dargestellt
  5660.   '                  Kann auch mit der Space-Taste produziert werden.
  5661.   ' PROCEDURE 1_write(t|,x%)        !_:
  5662.   ' ............................................................................
  5663.   ' * S p a l t e  2  : 'Notentaste'        Zeile1: 'LMT'
  5664.   '   (Notentaste auf Klaviatur und linke Maustaste)
  5665.   ' PROCEDURE 1_write(t|,x%)        !_:
  5666.   '   '1/8-Note':    Eine der Klaviaturtaste entspr. 1/8-Note wird dargestellt.
  5667.   '                  Es handelt sich um einen normalen Halbton.
  5668.   '                  Bei MIDI muß noch die 'Alternate'-Taste dazu gedrückt wer-
  5669.   '                  den.
  5670.   ' ............................................................................
  5671.   ' * S p a l t e  3  : 'r. Pausentaste'    Zeile1: 'LMT'
  5672.   '   (rechte Pausentaste auf Klaviatur und linke Maustaste)
  5673.   '   'Pause':       Funktioniert, wenn kein Blockbereich definiert ist:
  5674.   '                  Es wird eine 1/8-tel-Pause dargestellt
  5675.   '                  Kann auch mit der Space-Taste produziert werden.
  5676.   ' PROCEDURE 1_write(t|,x%)        !_:
  5677.   ' ............................................................................
  5678.   ' * S p a l t e  4  : 'Notentext'         Zeile1: 'LMT'
  5679.   '   (Mauspfeil auf Notentext und linke Maustaste)
  5680.   ' PROCEDURE 1_neu_cpos(x%,y%)     !_:
  5681.   ' Falls Cursor nicht auf Note unter Mauspfeil:
  5682.   '   'Cursorpos.': Der Cusor wird auf die Note unter dem Mauspfeil gesetzt.
  5683.   ' ............................................................................
  5684.   ' * S p a l t e  5  : 'Cursor'         Zeile1: 'LMT'
  5685.   ' PROCEDURE 2_takt_setzen   !_:
  5686.   ' Falls Cursor auf Note unter Mauspfeil:
  5687.   '   'Taktstr.':     Hier gesellt sich zur Note ein Taktstrich, falls vorher
  5688.   '                   noch keiner da war. War bereits einer da, so wird er ge-
  5689.   '                   löscht.
  5690.   '
  5691.   '
  5692.   ' ----------------------------------------------------------------------------
  5693.   '
  5694.   '
  5695.   '   Jetzt die 2. Zeile
  5696.   '
  5697.   '
  5698.   ' ----------------------------------------------------------------------------
  5699.   '
  5700.   '
  5701.   ' ............................................................................
  5702.   ' * S p a l t e  1  : 'l. Pausentaste'    Zeile2: 'RMT'
  5703.   '   (linke Pausentaste auf Klaviatur und rechte Maustaste)
  5704.   ' PROCEDURE 0_hauptmenue        !_:
  5705.   '    'Hauptmenü':  Hier kommt man ins Hauptmenü
  5706.   '                  Kann auch mit der 'Esc'-Taste erreicht werden.
  5707.   ' ............................................................................
  5708.   ' * S p a l t e  2  : 'Notentaste'        Zeile2: 'RMT'
  5709.   '   (Notentaste auf Klaviatur und rechte Maustaste)
  5710.   ' PROCEDURE 1_nur_ton(x%)         !_:
  5711.   '   'Nur Ton': Man hört nur eine Note, die wird aber weder dargestellt noch
  5712.   '              gespeichert.
  5713.   ' ............................................................................
  5714.   ' * S p a l t e  3  : 'r. Pausentaste'    Zeile2: 'RMT'
  5715.   '   (rechte Pausentaste auf Klaviatur und rechte Maustaste)
  5716.   ' PROCEDURE 1_backspace           !_:
  5717.   '   'Backspace':   Die Note links vom Cursor wird gelöscht.
  5718.   '                  Kann auch mit der linken Space-Taste erreicht werden.
  5719.   ' ............................................................................
  5720.   ' * S p a l t e  4  : 'Notentext'         Zeile2: 'RMT'
  5721.   '   (Mauspfeil auf Notentext und rechte Maustaste)
  5722.   ' PROCEDURE 1_spielen(x%,y%)      !_:
  5723.   '   'Abspielen':   Alle Noten zwischen und einschließlich den Noten unter dem
  5724.   '                  Cursor & unter dem Mauspfeil werden nacheinander gespielt.
  5725.   ' * Abbruch bei Abspielen: Auf die linke Maustaste drücken.
  5726.   '   Wenn Noten vom Programm abgespielt werden, kann dies mit der linken
  5727.   '   Maustaste abgebrochen werden.
  5728.   ' ............................................................................
  5729.   ' * S p a l t e  5  : 'Cursor'         Zeile2: 'RMT'
  5730.   ' PROCEDURE 1_faehnchen           !_:
  5731.   '   'Fähnchen': Bei der Note unter dem Cursor kommt noch ein Fähnchen dazu.
  5732.   '               Geht das nicht mehr, so fängt's wieder bei 0 Fähnchen an.
  5733.   ' ............................................................................
  5734.   '
  5735.   ' ............................................................................
  5736.   '
  5737.   '
  5738.   '     B e f e h l e,  n u r  ü b e r  T a s t e n  e r r e i c h b a r :
  5739.   '
  5740.   '
  5741.   '     'Control'-Taste:  Cursor eins weiter nach links
  5742.   '                       (Ein entsprechender Mausklick wird simuliert)
  5743.   '
  5744.   '     'Tab'-Taste:      Cursor eins weiter nach rechts
  5745.   '                       (Ein entsprechender Mausklick wird simuliert)
  5746.   '
  5747.   '     'Help'-Taste:     Hilfstext mit Befehlsübersicht und allerlei Infos
  5748.   '
  5749.   '     'a'oder'A':       Stück von anfang an durchspielen
  5750.   ' ............................................................................
  5751. RETURN
  5752. > PROCEDURE 0_ausfuehrliche_befehlsdukumentation_fuer_hauptmenue
  5753.   '
  5754.   ' ----------------------------------------------------------------------------
  5755.   '
  5756.   '
  5757.   '
  5758.   '     H a u p t m e n ü b e f e h l e :
  5759.   '
  5760.   '
  5761.   ' ----------------------------------------------------------------------------
  5762.   '                          Die Unterteilung des Hauptmenüs:
  5763.   '  Stückmenü
  5764.   '  Hauptfile
  5765.   '  Blockmenü
  5766.   '  Parameter
  5767.   '  Menü-Exit
  5768.   '
  5769.   ' ----------------------------------------------------------------------------
  5770.   '  stueckmenue:
  5771.   ' ----------------------------------------------------------------------------
  5772.   ' M e n ü p u n k t :    Stück auf Disk speichern
  5773.   ' PROCEDURE 2_stueck_abspeichern  !_:
  5774.   ' * Aktuelles Stück im RAM wird als einzelnes File vom RAM auf Diskette
  5775.   '   abgespeichert.
  5776.   ' M e n ü p u n k t :    Stück von Disk laden
  5777.   ' PROCEDURE 2_stueck_laden        !_:
  5778.   ' * Ein einzeln auf Diskette abgespeichertes Stück wird geladen und an die
  5779.   '   Stelle des aktuellen Stücks im RAM gesetzt. Das alte (vorher aktuelle)
  5780.   '   Stück geht dabei verloren (UNDO möglich).
  5781.   ' M e n ü p u n k t :    Stück in Hauptfile speichern
  5782.   ' PROCEDURE 1_abspeichern         !_:
  5783.   ' * Der Notentext wird abgespeichert. Wird hierbei als
  5784.   ' * Speichername "________" eingegeben, so wird das Stück,
  5785.   '    dessen Name damit überschrieben wurde, gelöscht.
  5786.   '   Abbruch durch Eingabe von '-1' möglich.
  5787.   ' M e n ü p u n k t :    Stück von Hauptfile laden
  5788.   ' PROCEDURE 1_laden               !_:
  5789.   ' * Der Notentext wird geladen.
  5790.   '   U n d o - Möglichkeit !
  5791.   ' M e n ü p u n k t :    bestimmte Stücke drucken
  5792.   ' PROCEDURE 2_drucken_gewaehlte   !_:
  5793.   ' * Einzelne, gewählte Stücke drucken.
  5794.   '   Abbruch vor jeder Druckseite einzeln od. insgesamt durch Alertbox möglich.
  5795.   ' M e n ü p u n k t :    bestimmte Stücke spielen
  5796.   ' PROCEDURE 2_spielen_gewaehlte   !_:
  5797.   ' * Einzelne, gewählte Stücke spielen.
  5798.   '   Abbruch während des Spielens durch 'Esc'-Taste.
  5799.   ' ----------------------------------------------------------------------------
  5800.   '  hauptfile:
  5801.   ' ----------------------------------------------------------------------------
  5802.   ' M e n ü p u n k t :    Hauptfile neuanlegen
  5803.   ' PROCEDURE 2_hauptfileneuanlegen !_:
  5804.   ' * Hauptfile auf Diskette und im RAM neuanlegen.
  5805.   ' M e n ü p u n k t :    Hauptfile neu laden
  5806.   ' PROCEDURE 2_hauptfile_laden     !_:
  5807.   ' * Haupfile von Diskette ins RAM laden.
  5808.   ' M e n ü p u n k t :    Hauptfile abspeichern
  5809.   ' PROCEDURE 2_save_hauptfile      !_:
  5810.   ' * Hauptfile vom RAM auf Diskette abspeichern.
  5811.   ' M e n ü p u n k t :    beliebiges File löschen
  5812.   ' PROCEDURE 2_file_loeschen       !_:
  5813.   ' * File auf Diskette löschen. Muß bestätigt werden.
  5814.   ' M e n ü p u n k t :    File umbenennen
  5815.   ' PROCEDURE 2_rename_file         !_:
  5816.   ' * Name eines Files kann hier geändert werden.
  5817.   ' M e n ü p u n k t :    Inhaltsverzeichnis drucken
  5818.   ' PROCEDURE 2_inhverz_drucken     !_:
  5819.   ' * Inhaltsverzeichnis des Hauptfiles drucken.
  5820.   ' M e n ü p u n k t :    Alle Stücke drucken
  5821.   ' PROCEDURE 2_drucken_ab_x_alle   !_:
  5822.   ' * Ab einer wählbaren Stelle im alphabetisch geordneten Inhaltsverzeichnis
  5823.   '   alle restlichen Stücke drucken. Abbruch durch Eingabe von '-1'.
  5824.   '   Abbruch vor jeder Druckseite einzeln od. insgesamt durch Alertbox möglich.
  5825.   ' M e n ü p u n k t :    Alle Stücke spielen
  5826.   ' PROCEDURE 2_spielen_ab_x_alle   !_:
  5827.   ' * Ab einer wählbaren Stelle im alphabetisch geordneten Inhaltsverzeichnis
  5828.   '   alle restlichen Stücke spielen. Abbruch durch Eingabe von '-1'.
  5829.   '   Abbruch während des Spielens durch 'Esc'-Taste.
  5830.   ' ----------------------------------------------------------------------------
  5831.   '  blockmenue:
  5832.   ' ----------------------------------------------------------------------------
  5833.   ' M e n ü p u n k t :    Anfang
  5834.   ' PROCEDURE 1_blockmark(x%,y%)    !_:
  5835.   ' * Blockanfang wird gesetzt und damit das Blockende auf Text-
  5836.   '   Ende. Ist Blockanfang schon gesetzt worden,
  5837.   '   dann halt Blockende,wenn Blockende auf Blockanfang gesetzt,
  5838.   '   dann wird die Blockmarkierung rückgängig gemacht=gelöscht.
  5839.   ' M e n ü p u n k t :    Ende
  5840.   ' PROCEDURE 1_blockmark(x%,y%)    !_:
  5841.   ' * Blockanfang wird gesetzt und damit das Blockende auf Text-
  5842.   '   ende.
  5843.   ' M e n ü p u n k t :    kopieren
  5844.   ' PROCEDURE 1_block_kopieren      !_:
  5845.   ' * Der Block wird vor den Cursor kopiert
  5846.   ' M e n ü p u n k t :    doppelt so schnell
  5847.   ' PROCEDURE 3_bl_faehnchen(v!,x%) !_:
  5848.   ' * Funktioniert, wenn Blockbereich definiert ist:
  5849.   '   Es wird überall im Block ein Fähnchen dazugesetzt.
  5850.   ' M e n ü p u n k t :    halb so schnell
  5851.   ' PROCEDURE 3_bl_faehnchen(v!,x%) !_:
  5852.   ' * Funktioniert, wenn Blockbereich definiert ist:
  5853.   '   Es wird überall im Block ein Fähnchen weniger dargestellt.
  5854.   ' M e n ü p u n k t :    transponieren
  5855.   ' PROCEDURE 3_bl_transponieren(x%)!_:
  5856.   ' * Block transponieren: gewünschte Startnote auf Klaviatur anklicken
  5857.   '   Wenn bereits ein Block über Blockmarken definiert worden ist, kann der
  5858.   '   gesamte Blockbereich um eine gewünschte Differenz in der Tonhöhe ver-
  5859.   '   schoben werden. Die Differenz errechnet sich dabei folgendermaßen.
  5860.   '   Ausgegangen wird von der 1. Note im Blockbereich. Dann klickt man die
  5861.   '   gewünschte neue Startnote auf der Klaviatur an. Die Differenz dieser
  5862.   '   beiden Töne ist dann die Verschiebedifferenz der Transponierprozedur.
  5863.   ' M e n ü p u n k t :    löschen
  5864.   '  PROCEDURE 2_block_loeschen      !_:
  5865.   ' * Der Block wird gelöscht. Bestätigung erforderlich.
  5866.   '   U n d o - Möglichkeit !
  5867.   ' ----------------------------------------------------------------------------
  5868.   '  parameter:
  5869.   ' ----------------------------------------------------------------------------
  5870.   ' M e n ü p u n k t :    Abspielgeschwindigkeit
  5871.   ' PROCEDURE 1_abspielgeschw       !_:
  5872.   ' * Die Abspielgeschwindigkeit kann verändert werden.
  5873.   ' M e n ü p u n k t :    Pause zw den Stücken
  5874.   ' PROCEDURE 1_stueckpause         !_:
  5875.   ' * Pause zwischen den Stücken beim Abspielen mehrerer Stücke kann hier ein-
  5876.   '   gestellt werden
  5877.   ' M e n ü p u n k t :    Tonhöhe
  5878.   ' PROCEDURE 1_tonhoehe            !_:
  5879.   ' * Die Tonhöhe kann verändert werden, nur für einen kleinen Bereich um
  5880.   '   440 Hz sinnvoll, da sonst Unstimmigkeiten auftreten.
  5881.   ' M e n ü p u n k t :    Midi ein/aus
  5882.   ' PROCEDURE 1_midi_ein_aus        !_:
  5883.   ' * Hier wird festgelegt, wo die Tonausgabe stattfinden soll und ob ein
  5884.   '   Keyboard zur Eingabe verwendbar ist.
  5885.   ' ----------------------------------------------------------------------------
  5886.   '  menue_exit:
  5887.   ' ----------------------------------------------------------------------------
  5888.   ' M e n ü p u n k t :    Eingabe fortsetzen
  5889.   ' * hier wird nichts gemacht
  5890.   ' M e n ü p u n k t :    Edit
  5891.   ' PROCEDURE 1_programmende(w|)    !_:
  5892.   ' * in den Editor ohne Bestätigung
  5893.   ' M e n ü p u n k t :    Quit
  5894.   ' PROCEDURE 1_programmende(w|)    !_:
  5895.   ' * Das Programm beenden, Bestätigung erforderlich.
  5896.   ' ----------------------------------------------------------------------------
  5897.   '
  5898.   ' !! w i c h t i g !!
  5899.   '
  5900.   ' ----------------------------------------------------------------------------
  5901.   ' Ein Menü, in dem die aktuellen Einträge invers dargestellt werden, kann
  5902.   ' durch die linke Maustaste und Mauspfeil außerhalb der Einträge abge-
  5903.   ' brochen werden.
  5904.   ' Muß in einem Menü etwas eingegeben werden, so kann auch hier abgebrochen
  5905.   ' werden, nämlich indem man einfach nichts eingibt.
  5906.   ' ----------------------------------------------------------------------------
  5907. RETURN
  5908. ' ##############################################################################
  5909. '  P r o g r a m m t e x t e n d e :
  5910. ' ##############################################################################
  5911.